设计模式

来源:互联网 发布:电子设备审计软件功能 编辑:程序博客网 时间:2024/06/07 01:53

          

         在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。

模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实例的细节和复杂过程呢?

解决方案建立一个工厂来创建对象

实现:

一、引言
    1)还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用。
    2)简单工厂模式:后来出现工业革命。用户不用去创建宝马车。因为客户有一个工厂来帮他创建宝马.想要什么车,这个工厂就可以建。比如想要320i系列车。工厂就创建这个系列的车。即工厂可以创建产品。
    3)工厂方法模式时代:为了满足客户,宝马车系列越来越多,如320i,523i,30li等系列一个工厂无法创建所有的宝马系列。于是由单独分出来多个具体的工厂。每个具体工厂创建一种系列。即具体工厂类只能创建一个具体产品。但是宝马工厂还是个抽象。你需要指定某个具体的工厂才能生产车出来。
    4)抽象工厂模式时代:随着客户的要求越来越高,宝马车必须配置空调。而且这空调必须对应给系列车才能使用。于是这个工厂开始生产宝马车和需要的空调。
         最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。而不用自己去创建523i空调车宝马车.
   (我只是举个例子,说到宝马配置空调完全是为了举例,甚至有点扯,哪有车和空调必须对应才能使用啊)
     这就是工厂模式。
二、分类 
        工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。 
工厂模式可以分为三类: 
1)简单工厂模式(Simple Factory) 
2)工厂方法模式(Factory Method) 
3)抽象工厂模式(Abstract Factory) 
         这三种模式从上到下逐步抽象,并且更具一般性。 
        GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。 
三、区别 
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类可以创建多个具体产品类的实例。   
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
两者皆可。 


四、简单工厂模式 
建立一个工厂(一个函数或一个类方法)来制造新的对象。
分布说明引子:从无到有。客户自己创建宝马车,然后拿来用。
 


  1. <?php  
  2. /** 
  3.  * 车子系列 
  4.  * 
  5.  */  
  6. Class BWM320{  
  7. function __construct($pa) {  
  8.   
  9. }  
  10. }  
  11. Class BMW523{  
  12.    function __construc($pb){  
  13.   
  14. }  
  15. }  
  16.   
  17. /** 
  18.  *  
  19.  * 客户自己创建宝马车 
  20.  */  
  21. class Customer {  
  22.   
  23.    function createBMW320(){  
  24.        return new BWM320();  
  25.    }  
  26.   
  27.    function createBMW523(){  
  28.        return new BMW523();  
  29.    }  
  30. }   


       客户需要知道怎么去创建一款车,客户和车就紧密耦合在一起了.为了降低耦合,就出现了工厂类,把创建宝马的操作细节都放到了工厂里面去,客户直接使用工厂的创建工厂方法,传入想要的宝马车型号就行了,而不必去知道创建的细节.这就是工业革命了:简单工厂模式

即我们建立一个工厂类方法来制造新的对象。如图:



产品类:

  1. <?php  
  2. /** 
  3.  * 车子系列 
  4.  * 
  5.  */  
  6. abstract Class BWM{  
  7.     function __construct($pa) {  
  8.   
  9.     }  
  10. }  
  11. Class BWM320 extends BWM{  
  12.     function __construct($pa) {  
  13.   
  14.     }  
  15. }  
  16. Class BMW523 extends BWM{  
  17.    function __construc($pb){  
  18.   
  19.    }  
  20. }  

 工厂类:

  1. /** 
  2.  *  
  3.  * 工厂创建车 
  4.  */  
  5. class Factory {  
  6.   
  7.   
  8.     static function  createBMW($type){  
  9.         switch ($type) {  
  10.           case 320:  
  11.              return new BWM320();  
  12.           case 523:  
  13.              return new BMW523();  
  14.         //....  
  15.    }  
  16. }  

客户类:

  1. /** 
  2.  *  
  3.  * 客户通过工厂获取车 
  4.  */  
  5. class Customer {  
  6.     private $BMW;  
  7.     function getBMW($type){  
  8.         $this¬-> BMW =  Factory::createBMW($type);  
  9.     }  
  10. }  


      简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。 
      先来看看它的组成: 
         1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。
         2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。         
         3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。 
        
        下面我们从开闭原则(对扩展开放;对修改封闭)上来分析下简单工厂模式。当客户不再满足现有的车型号的时候,想要一种速度快的新型车,只要这种车符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。所以对产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为每增加一种新型车,都要在工厂类中增加相应的创建业务逻辑(createBMW($type)方法需要新增case),这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类,我们称它为全能类 或者上帝类。 
        我们举的例子是最简单的情况,而在实际应用中,很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会把我们的上帝累坏了,也累坏了我们这些程序员:( 
        于是工厂方法模式作为救世主出现了。 工厂类定义成了接口,而每新增的车种类型,就增加该车种类型对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码。
五、工厂方法模式 
        工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。 
工厂方法模式组成: 
       1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 
       2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。 
       3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。 
       4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。 
       工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有 的代码。可以看出工厂角色的结构也是符合开闭原则的! 
 


代码如下: 

产品类:

  1. <?php  
  2. /** 
  3.  * 车子系列 
  4.  * 
  5.  */  
  6. abstract Class BWM{  
  7. function __construct($pa) {  
  8.   
  9. }  
  10. }  
  11. Class BWM320 extends BWM{  
  12. function __construct($pa) {  
  13.   
  14. }  
  15. }  
  16. Class BMW523 extends BWM{  
  17.    function __construc($pb){  
  18.   
  19. }  
  20. }  


创建工厂类:

  1. /** 
  2.  * 创建工厂的接口 
  3.  * 
  4.  */  
  5. interface FactoryBMW {   
  6.        function createBMW();   
  7. }   
  8.   
  9.   
  10. /** 
  11.  *  
  12.  * 创建BWM320车 
  13.  */  
  14. class FactoryBWM320 implements FactoryBMW {  
  15.    function  createBMW($type){  
  16.       return new BWM320();  
  17.    }  
  18.   
  19. }  
  20.   
  21.   
  22. /** 
  23.  *  
  24.  * 创建BWM523车 
  25.  */  
  26. class FactoryBWM523 implements FactoryBMW {  
  27.    function  createBMW($type){  
  28.       return new BMW523();  
  29.    }  
  30. }  


客户类:

  1. /** 
  2.  *  
  3.  * 客户得到车 
  4.  */  
  5. class Customer {  
  6.    private $BMW;  
  7.    function  getBMW($type){  
  8.       switch ($type) {  
  9.         case 320:  
  10.            $BWM320 = new FactoryBWM320();  
  11.            return $BWM320->createBMW();  
  12.         case 523:  
  13.            $BWM523 = new FactoryBWM523();  
  14.            return $BWM320->createBMW();  
  15.             //....  
  16.       }  
  17.   
  18.   }  
  19. }  


       可以看出工厂方法的加入,使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。因为如果不能避免这种情 况,可以考虑使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实 现。

工厂方法小结: 
        工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口。那我们是否一定要在代码中遍布工厂呢?大可不必。也许在下面情况下你可以考虑使用工厂方法模式: 
     1)当客户程序不需要知道要使用对象的创建过程。 
     2)客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。


       简单工厂模式与工厂方法模式真正的避免了代码的改动了?没有。在简单工厂模式中,新产品的加入要修改工厂角色中的判断语句;而在工厂方法模式中,要么将判 断逻辑留在抽象工厂角色中,要么在客户程序中将具体工厂角色写死(就象上面的例子一样)。而且产品对象创建条件的改变必然会引起工厂角色的修改。
       面对这种情况,我们可以使用反射机制:

  1.  class Customer {  
  2.      private $BMW;  
  3.      function  getBMW($type){  
  4.          $class = new ReflectionClass('FactoryBWM' .$type );//建立 'FactoryBWM'这个类的反射类    
  5.           $instance  = $class->newInstanceArgs();//相当于实例化'FactoryBWM' .$type类    
  6.           return $instance->createBMW();  
  7.         //或者直接   
  8.          /** 
  9.          * $instance = new 'FactoryBWM' .$type(); 
  10.          * return $instance->createBMW(); 
  11.          */  
  12.     }  
  13. }  

 

六、抽象工厂模式 
       随着客户的要求越来越高,宝马车需要配置空调。于是这个工厂开始生产宝马车和配置需要的空调。这时候工厂有二个系列的产品:宝马车和空调.宝马车必须使用对应的空调才能使用.这时候分别使用一个车工厂和一个空调工厂都不能满足我们的需求,我们必须确认车跟空调的对应关系。因此把车工厂跟空调工厂联系在一起。因此出现了抽象工厂模式。
     可以说,抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。 
抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足一下条件:
     1)系统中有多个产品族,而系统一次只可能消费其中一族产品。 
     2)同属于同一个产品族的产品以其使用。 
抽象工厂模式的各个角色(和工厂方法一样): 
     1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 
     2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
     3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。
     4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。

 

其结构:


 
我们的例子:
 

代码:

产品类:

  1. <?php  
  2. /** 
  3.  * 车子系列以及型号 
  4.  * 
  5.  */  
  6. abstract class  BWM{  
  7. }  
  8.   
  9. class BWM523 extends  BWM {  
  10. }  
  11. class BWM320 extends  BWM {  
  12.   
  13.   
  14. }  
  15. /** 
  16.  * 空调 
  17.  * 
  18.  */  
  19. abstract class aircondition{  
  20. }  
  21. class airconditionBWM320  extends aircondition {  
  22.   
  23. }  
  24. class airconditionBWM52 extends aircondition {  
  25.   
  26. }  
创建工厂类:

  1. /** 
  2.  * 创建工厂的接口 
  3.  * 
  4.  */  
  5. interface FactoryBMW {   
  6.      function createBMW();   
  7.      function createAirC();   
  8. }   
  9.   
  10.   
  11. /** 
  12.  *  
  13.  * 创建BWM320车 
  14.  */  
  15. class FactoryBWM320 implements FactoryBMW {  
  16.     function  createBMW(){  
  17.     return new BWM320();  
  18. }  
  19. function  createAirC(){ //空调  
  20.     return new airconditionBWM320();  
  21. }  
  22. }  
  23.   
  24.   
  25. /** 
  26.  *  
  27.  * 创建BWM523车 
  28.  */  
  29. class FactoryBWM523 implements FactoryBMW {  
  30.     function  createBMW(){  
  31.     return new BWM523();  
  32. }  
  33. function  createAirC(){  
  34.     return new airconditionBWM523();  
  35. }  
  36. }  
客户:

  1. /** 
  2.  *  
  3.  * 客户得到车 
  4.  */  
  5. class Customer {  
  6.    private $BMW;  
  7.    private $airC;  
  8.    function  getBMW($type){  
  9.        $class = new ReflectionClass('FactoryBWM' .$type );//建立 Person这个类的反射类    
  10.         $instance  = $class->newInstanceArgs();//相当于实例化Person 类    
  11.         $this->BMW =  $instance->createBMW();  
  12.        $this->airC =  $instance->createAirC();  
  13.    }  
  14. }  

         

         在设计模式中,Factory Method模式是一种比较简单的设计模式,应用比较广泛,但也是一种比较重要的设计模式之一。在很多地方我们都会看到xxxFactory这样命名的类,那么,什么是Factory Method,为什么要用这个模式,如何用Java语言来实现该模式?

【1】基本概念

          FactoryMethod是一种创建性模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类.当一个类无法预料要创建哪种类的对象或是一个类需要由子类来指定创建的对象时我们就需要用到Factory Method 模式了.简单说来,Factory Method可以根据不同的条件产生不同的实例,当然这些不同的实例通常是属于相同的类型,具有共同的父类.Factory Method把创建这些实例的具体过程封装起来了,简化了客户端的应用,也改善了程序的扩展性,使得将来可以做最小的改动就可以加入新的待创建的类. 通常我们将Factory Method作为一种标准的创建对象的方法,当发现需要更多的灵活性的时候,就开始考虑向其它创建型模式转化。

【2】简单分析

          我们先来看一下该设计模式的UML图:


上图是Factory Method 模式的结构图,让我们可以进行更方便的描述:

  1. Product: 需要创建的产品的抽象类.
  2. ConcreteProduct: Product的子类,一系列具体的产品.
  3. Creator: 抽象创建器接口,声明返回Product类型对象的Factory Method.
  4. ConcreteCreator: 具体的创建器,重写Creator中的Factory Method,返回ConcreteProduct类型的实例.

同时可以清楚的看出这样的平行对应关系: Product <====> Creator ; ConreteProduct <====> ConreteCreator

抽象产品对应抽象创建器,具体产品对应具体创建器.这样做的好处是什么呢?为什么我们不直接用具体的产品和具体的创建器完成需求呢?实际上我们也可以这样做.但通过Factory Method模式来完成,客户(client)只需引用抽象的Product和Creater,对具体的ConcreteProduct和ConcreteCreator可以毫不关心,这样做我们可以获得额外的好处:

  • 首先客户端可以统一从抽象创建器获取产生的实例,Creator的作用将client和产品创建过程分离开来,客户不用操心返回的是那一个具体的产品,也不用关心这些产品是如何创建的.同时,ConcreteProduct也被隐藏在Product后面,ConreteProduct继承了Product的所有属性,并实现了Product中定义的抽象方法,按照Java中的对象造型(cast)原则,通过ConcreteCreator产生的ConcreteProduct可以自动的上溯造型成Product.这样一来,实质内容不同的ConcreteProduct就可以在形式上统一为Product,通过Creator提供给client来访问.
  • 其次,当我们添加一个新的ConcreteCreator时,由于Creator所提供的接口不变,客户端程序不会有丝毫的改动,不会带来动一发而牵全身的灾难, 这就是良好封装性的体现.但如果直接用ConcreteProduct和ConcreteCreator两个类是无论如何也做不到这点的. 优良的面向对象设计鼓励使用封装(encapsulation)和委托(delegation),而Factory Method模式就是使用了封装和委托的典型例子,这里封装是通过抽象创建器Creator来体现的,而委托则是通过抽象创建器把创建对象的责任完全交给具体创建器ConcreteCreator来体现的.
【3】如何用java语言来实现该模式

该模式采用一个Shape(形状)的经典例子作为一个实例来展示如何实现Factory Method模式,先看下代码的结构图:


3.1 首先定义一个抽象类Shape,定义两个抽象的方法.

[html] view plaincopy
  1. package com.andyidea.patterns.product;  
  2.   
  3. /**  
  4.  * Product: 需要创建的产品的抽象类.  
  5.  * @author Andy.Chen  
  6.  *  
  7.  */  
  8. public abstract class Shape {  
  9.       
  10.     public String name;  
  11.     public Shape(String aName){  
  12.         this.name = aName;  
  13.     }  
  14.       
  15.     //绘画  
  16.     public abstract void draw();  
  17.     //擦除  
  18.     public abstract void erase();  
  19.   
  20. }  
3.2  定义 Shape的两个子类: Circle, Square,实现Shape中定义的抽象方法

Circle中的源码如下:

[html] view plaincopy
  1. package com.andyidea.patterns.concreteproduct;  
  2.   
  3. import com.andyidea.patterns.product.Shape;  
  4.   
  5. /**  
  6.  * 圆形子类(ConcreteProduct: Product的子类,一系列具体的产品.)  
  7.  * @author Andy.Chen  
  8.  *  
  9.  */  
  10. public class Circle extends Shape{  
  11.   
  12.     public Circle(String name) {  
  13.         super(name);  
  14.     }  
  15.   
  16.     @Override  
  17.     public void draw() {  
  18.         System.out.println("It will draw a Circle");  
  19.     }  
  20.   
  21.     @Override  
  22.     public void erase() {  
  23.         System.out.println("It will erase a Circle");  
  24.     }  
  25.   
  26. }  
Square中的源码:

[html] view plaincopy
  1. package com.andyidea.patterns.concreteproduct;  
  2.   
  3. import com.andyidea.patterns.product.Shape;  
  4.   
  5. /**  
  6.  * 方形子类(ConcreteProduct: Product的子类,一系列具体的产品.)  
  7.  * @author Andy.Chen  
  8.  *  
  9.  */  
  10. public class Square extends Shape{  
  11.   
  12.     public Square(String name) {  
  13.         super(name);  
  14.     }  
  15.   
  16.     @Override  
  17.     public void draw() {  
  18.         System.out.println("It will draw a Square");  
  19.     }  
  20.   
  21.     @Override  
  22.     public void erase() {  
  23.         System.out.println("It will erase a Square");  
  24.     }  
  25.   
  26. }  
3.3  定义抽象的创建器,anOperation调用factoryMethod创建一个对象,并对该对象进行一系列操作.

[html] view plaincopy
  1. package com.andyidea.patterns.creator;  
  2.   
  3. import com.andyidea.patterns.product.Shape;  
  4.   
  5. /**  
  6.  * Creator: 抽象创建器接口,声明返回Product类型对象的Factory Method.  
  7.  * @author Andy.Chen  
  8.  *  
  9.  */  
  10. public abstract class ShapeFactory {  
  11.       
  12.     protected abstract Shape factoryMethod(String aName);  
  13.       
  14.     public void anOperation(String aName){  
  15.         Shape s = factoryMethod(aName);  
  16.         System.out.println("The current shape is: " + s.name);  
  17.         s.draw();  
  18.         s.erase();  
  19.     }  
  20.   
  21. }  
3.4  定义与circle和square相对应的两个具体创建器CircleFactory,SquareFactory,实现父类的methodFactory方法

CircleFactory中的源码:

[html] view plaincopy
  1. package com.andyidea.patterns.concretecreator;  
  2.   
  3. import com.andyidea.patterns.concreteproduct.Circle;  
  4. import com.andyidea.patterns.creator.ShapeFactory;  
  5. import com.andyidea.patterns.product.Shape;  
  6.   
  7. /**  
  8.  * ConcreteCreator: 具体的创建器,重写Creator中的Factory Method,  
  9.  * 返回ConcreteProduct类型的实例.  
  10.  * @author Andy.Chen  
  11.  *  
  12.  */  
  13. public class CircleFactory extends ShapeFactory {  
  14.   
  15.     @Override  
  16.     protected Shape factoryMethod(String aName) {  
  17.         return new Circle(aName + " (created by CircleFactory)");  
  18.     }  
  19.   
  20. }  
SquareFactory中的源码:

[html] view plaincopy
  1. package com.andyidea.patterns.concretecreator;  
  2.   
  3. import com.andyidea.patterns.concreteproduct.Square;  
  4. import com.andyidea.patterns.creator.ShapeFactory;  
  5. import com.andyidea.patterns.product.Shape;  
  6.   
  7. /**  
  8.  * ConcreteCreator: 具体的创建器,重写Creator中的Factory Method,  
  9.  * 返回ConcreteProduct类型的实例.  
  10.  * @author Andy.Chen  
  11.  *  
  12.  */  
  13. public class SquareFactory extends ShapeFactory {  
  14.   
  15.     @Override  
  16.     protected Shape factoryMethod(String aName) {  
  17.         return new Square(aName + " (created by SquareFactory)");  
  18.     }  
  19.   
  20. }  
3.5  测试类MainClient:这个客户端程序没有罗嗦的条件判断语句,也无需关心ConcreteProduct和ConcreteCreator的细节(因为这里我用anOperation封装了Product里的两个方法,所以连Product的影子也没看见,当然把Product里方法的具体调用放到客户程序中也是不错的).
[html] view plaincopy
  1. package com.andyidea.patterns.client;  
  2.   
  3. import com.andyidea.patterns.concretecreator.CircleFactory;  
  4. import com.andyidea.patterns.concretecreator.SquareFactory;  
  5. import com.andyidea.patterns.creator.ShapeFactory;  
  6.   
  7. /**  
  8.  * 测试设计模式类  
  9.  * @author Andy.Chen  
  10.  *  
  11.  */  
  12. public class MainClient {  
  13.   
  14.     public static void main(String[] args) {  
  15.         ShapeFactory sf1 = new CircleFactory();  
  16.         ShapeFactory sf2 = new SquareFactory();  
  17.           
  18.         System.out.println("Welcome to Andy.Chen Blog!" +"\n"   
  19.                            +"Factory Method Patterns." +"\n"  
  20.                            +"-------------------------------");  
  21.           
  22.         sf1.anOperation("Shape-Circle");  
  23.         sf2.anOperation("Shape-Square");  
  24.     }  
  25. }  
【4】程序运行结果如下:

[html] view plaincopy
  1. Welcome to Andy.Chen Blog!  
  2. Factory Method Patterns.  
  3. -------------------------------  
  4. The current shape is: Shape-Circle (created by CircleFactory)  
  5. It will draw a Circle  
  6. It will erase a Circle  
  7. The current shape is: Shape-Square (created by SquareFactory)  
  8. It will draw a Square  
  9. It will erase a Square  

【5】总结:用Factory Method模式创建对象并不一定会让我们的代码更短,实事上往往更长,我们也使用了更多的类,真正的目的在于这样可以灵活的,有弹性的创建不确定的对象.而且,代码的可重用性提高了,客户端的应用简化了,客户程序的代码会大大减少,变的更具可读性。

原文链接:http://blog.csdn.net/cjjky/article/details/7314118

参考文链接:http://blog.csdn.net/hguisu/article/details/7505909

0 0
原创粉丝点击