Friday, May 07, 2010

0507: Factory Design Pattern

  • Simple Factory
  • Factory
  • Abstract Factory

Code Sample

Simple Factory :

 

public static Fruit CreateFruit(string fruitType)
       {
           if (!String.IsNullOrEmpty(fruitType))
           {
               switch (fruitType)
               {
                   case "Apple":
                       return new Apple();
                   case "Orange":
                       return new Orange();
                   case "Pear":
                       return new Pear();
                   case "Banana":
                       return new Banana();
               }
           }
           return null;
       }

 

DPSimpleFactoryFactoryAbstractFactory.SimpleFactory.FruitFactory.CreateFruit("Apple").Display();          DPSimpleFactoryFactoryAbstractFactory.SimpleFactory.FruitFactory.CreateFruit("Orange").Display();                    DPSimpleFactoryFactoryAbstractFactory.SimpleFactory.FruitFactory.CreateFruit("Pear").Display();

 

Factory :

 

DPSimpleFactoryFactoryAbstractFactory.Factory.FruitFactory factory;
DPSimpleFactoryFactoryAbstractFactory.Factory.Fruit fruit;

           //首先要实例化一个苹果工厂
           factory = new AppleFactory();
           //然后通过工厂来获得苹果类对象
           fruit = factory.GetFruit();
           //访问苹果类对象
           fruit.Display();

           //首先要实例化一个梨子工厂
           factory = new PearFactory();
           //然后通过工厂来获得梨子类对象
           fruit = factory.GetFruit();
           //访问梨子类对象
           fruit.Display();

 

 

Abstract Factory :

 

AbstractFactory.AbstractFactory factory;
           Button button;
           TextBox textBox;

           //Windows 下操作
           factory = new WindowsFactory();
           button = factory.CreateButton();
           textBox = factory.CreateTextBox();
           button.DisplayButton();
           textBox.DisplayTextBox();

           Console.WriteLine();

           //Linux 下操作
           factory = new LinuxFactory();
           button = factory.CreateButton();
           textBox = factory.CreateTextBox();
           button.DisplayButton();
           textBox.DisplayTextBox();

 

(ZT)

下面总结一下抽象工厂的优缺点

            首先,抽象工厂的话,其可以更加方便的实现交换一个产品系列,

            就像上面的 Demo 中可以轻易的实现从 Linux 上转换为 Windows,

            同时,客户端代码中依赖的是抽象,而非具体的实现,

            但是,抽象工厂也是有缺点的,其实这个缺点也很明显,那就是显得过于臃肿,上面的 Demo 尽管还只有两个产品族,类图就显得有些难看了,

            如果产品族一多的话,那么总的类数是成几倍的增加,这样使整个结构变得过于复杂,类的结构也会变得更为庞大。

0 Comments:

Post a Comment

<< Home