ZEISS T*

有点上不去下不来的感觉……

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
对于设计模式不太了解,又想去学习,最近看了点简单的设计模式,简单谈下“简单工厂”和“抽象工厂”这两种工厂模式,
本人初学,如又错误敬请匡正。

由于大部分设计模式讲解都是在UML基础上开展的,而我又看不太懂UML,所以,还是用代码表示我的意思吧。

简单工厂,通过一个对象去创建另一个对象(或者另一组对象):
class MyClass
{
}

class MyFactory
{
      public MyClass CreateMyClass()
      {
            return new MyClass();
      }
}

上面的例子可以看做简单工厂,当然这种简单工厂是没有任何意义的,你完全可以需要MyClass的时候自己new一个出来,工厂这个东西出现是为了提供统一接口,为不同实现提供同样的方法而存在的(至少是其中的一个目的)。所以,改写一下:
Code
这上面的例子通过提取MyClass1和MyClass2的共同方法常见接口,而MyClass1和MyClass2实现了IMyClass接口,而MyFactory工厂创建的时候,根据一些外部条件去选择到底创建谁。这里通过一个b来表示,当然这个b可能是外部可以改变的,或者类内某些条件可能触发其变化的。
在PetShop里,DAL的创建是根据反射的原件动态创建的。

对于第一段代码,调用的方法如下:
MyFactory mf = new MyFactory();
MyClass mc = mf.CreateMyClass();

而对于第二段代码,调用方法如下:
MyFactory mf = new MyFactory();
IMyClass mc = mf.CreateMyClass();

两段代码的调用代码唯一不同就在于,mc的类型,一个是MyClass类型,一个是IMyClass类型,这样,第二段代码,管他mc是什么对象,但类型总是IMyClass类型的,或者确切说,总是实现了IMyClass接口的,那么任何IMyClass的方法,对于这些mf创造的这些mc们都是可以用的。

这个应该算是具有实际意义的最简单的简单工厂了。

下面说下抽象工厂:
上面的mf是通过new实例化的,也就是说,mc是被抽象成了IMyClass,而mf还是具体的MyFactory,也就是说,这个工厂还是具体的,而不是抽象的,抽象工厂的意思就是,连Factory工厂本身都是抽象的。
Code

通过上面的代码,我们这样调用:
IMyFactory mf = null;
bool b = false;
if (b) mf=new MyFactory1();
else mf=new MyFactory2();

IMyClass mc = mf.CreateMyClass();

但是具体为什么要这样做,有什么好处,还不太理解,经验太少,还要努力学习。
posted on 2009-08-18 15:02  Zeiss T*  阅读(682)  评论(3编辑  收藏  举报