以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 软件工程论坛 』   (http://bbs.xml.org.cn/list.asp?boardid=48)
----  [原创]理解设计模式(一)工厂模式  (http://bbs.xml.org.cn/dispbbs.asp?boardid=48&rootid=&id=39097)


--  作者:wcdxyl
--  发布时间:10/19/2006 4:32:00 PM

--  [原创]理解设计模式(一)工厂模式
软件开发过程中需求变更是家常便饭,调研不充分,特殊情况,设计失误都会打乱原来的计划,实际表明瀑布开发实在是一种太理想的状态。除了采用迭代开发模式以外,开发方法也必须讲究,这样才能适应以后的需求变化,不会前功尽弃。办法只有一个,利用设计模式,避免使用硬编码。我最近看了一些设计模式把自己的理解共享给大家。

  工厂模式 就是通过一个工厂类创建所有类,好处是隐藏了具体类的实现细节,可以根据参数决定生成哪些具体类的实例。并且可以推迟到运行的时候才决定要创建哪个类的实例,而不是在编译时就必须知道要实例化哪个类,可见避免了硬编码。也就是说一旦要创建实例只需要通过工厂类创建就可以了,降低了耦合度。
  但是这种模式有两个问题,第一个是随着使用类的增加就使工厂类变得复杂,还有个问题是如果工厂类出了问题将导致整个系统不能使用。解决第一个问题可以建立多个抽象工厂类,而第二个问题可以尽量分类工厂类,最好按模块分。
  另外循环使用一个对象的时候可以通过工厂类建立一个对象池,这样每当客户请求工厂方法创建相应的对象时,可以先从对象池中查询符合条件的产品对象,如果对象池中有这样的对象,那就直接将这个产品对象返回给客户端;如果对象池中没有这样的对象,那就创建一个新的产品对象,将其登记到对象池中,然后再返回给客户端。



--  作者:pennyliang
--  发布时间:12/21/2006 11:08:00 AM

--  
工厂模式首要条件是面向接口编程,设计模式,从每个模式命名可以知道,是面向应用的,换句话说不是本质,而是现象。
      对一个对象的请求,之前,应用已经获得了该对象接口的全部,只是不知道具体的对象,用工厂模式最为恰当,为了更好的说明问题,举个例子。
      以下是伪码。
      interface user
      int get_id();
      bool is_boy();
      bool is_girl();
      void dispose();
      ......
-----------------------------应用一端--------------------------
user* my_user = Factory.Create(SYSTEM_USER);   //这里应用必须知道Factory的实例,所以的应用和Factory耦合。但是Factor.Create,如何实例化一个对象并不需要应用一端关心。
。。。。
my_user->dispose(); //注意应用一端只知道接口,不知道具体类型,所以不能delete my_user.

------------------------------工厂一端--------------------------
class Factory
user* Create(int type)
{
     if(SYSTEM_USER == type)
     {
           return new pennyliang();
     }
}

面向对象是理论化很强的学科,设计模式只是面向应用的一个方面,希望大家从面向对象本质去了解问题。设计模式好比招式,而且招式也远不是设计模式所能概括的,对设计模式的评价不能展开了,希望这个例子大家能够理解,面向接口编程而不是面向实现编程才是工厂模式的真谛。依赖倒置原理(DIP),也是工厂方式的内在涵义。

}


--  作者:pennyliang
--  发布时间:12/21/2006 11:14:00 AM

--  
工厂模式首要条件是面向接口编程,设计模式,从每个模式命名可以知道,是面向应用的,换句话说不是本质,而是现象。
      对一个对象的请求,之前,应用已经获得了该对象接口的全部,只是不知道具体的对象,用工厂模式最为恰当,为了更好的说明问题,举个例子。
      以下是伪码。
      interface user
      int get_id();
      bool is_boy();
      bool is_girl();
      void dispose();
      ......
-----------------------------应用一端--------------------------
user* my_user = Factory.Create(SYSTEM_USER);   //这里应用必须知道Factory的实例,所以的应用和Factory耦合。但是Factor.Create,如何实例化一个对象并不需要应用一端关心。
。。。。
my_user->dispose(); //注意应用一端只知道接口,不知道具体类型,所以不能delete my_user.

------------------------------工厂一端--------------------------
class Factory
user* Create(int type)
{
     if(SYSTEM_USER == type)
     {
           return new pennyliang();
     }
}

面向对象是理论化很强的学科,设计模式只是面向应用的一个方面,希望大家从面向对象本质去了解问题。设计模式好比招式,而且招式也远不是设计模式所能概括的,对设计模式的评价不能展开了,希望这个例子大家能够理解,面向接口编程而不是面向实现编程才是工厂模式的真谛。依赖倒置原理(DIP),也是工厂方式的内在涵义。

}


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
54.688ms