设计模式2——创建型模式之工厂方法模式

定义 :工厂方法模式 (FactoryMethod Pattern) ,定义一个用于创建对象的接口,让子类决定实例化哪一个类。定义一个抽象工厂类,每一个产品,按照抽象工厂的基本要求新建一个工厂来生产新的产品。

类型:创建型模式。

类图

参与角色

  1. AbstrctProduct,提供产品生产的标准接口。
  2. ConcreteProductAConcreteProductB,按接口具体去实现生产的产品。
  3. AbstractFactory,提供标准工厂规模的抽象工厂。
  4. ConcreteFactoryAConcreteFactoryB,按接口标准定制的具体生产产品的在厂。

概述

         简单工厂模式,在使用时,会违背OCP原则。工厂方法模式就是为了解决这一问题而产生的。每当有一个新的产品要生产时,不用去更改原有的产品线,也不用去修改原有的工厂,一切按规定析添加。这样产品的生产流程一致,新工厂的建造也一致。工厂原有的生产管理方法便可以继续使用,而且人员也不用重新培训,就可以直接上岗。

         因为当增加新的订单时,不需要去更改旧有的产品线以及工厂,这样就可以最大限度的保证原有的产品能够正常运行。这一点,就是工厂方法的核心。下面就以代码来展现这一过程。

代码

// C++
#include  <iostream>
#include  <afxcom_.h> 
using  namespace  std ;
 
class  CCellPhone
{
public :
     virtual  void  ProducePhone ( )
     {
         cout << "Produce Normal Phone." << endl ;
     }
} ;
 
class  CNokia  :  public  CCellPhone
{
public :
     virtual  void  ProducePhone ( )
     {
         cout << "Produce Nokia Phone." << endl ;
     }
} ;
 
class  CSamsung  :  public  CCellPhone
{
public :
     virtual  void  ProducePhone ( )
     {
         cout << "Produce Samsung Phone." << endl ;
     }
} ;
 
class  CPhoneFactory
{
public :
     virtual  CCellPhone *  CreatePhone ( )  =  0 ;
} ;
 
class  CNokiaFactory  :  public  CPhoneFactory
{
public :
     virtual  CCellPhone *  CreatePhone ( )
     {
         CCellPhone  * pPhone  =  new  CNokia ( ) ;
 
         return  pPhone ;
     }
} ;
 
class  CSamsungFactory  :  public  CPhoneFactory
{
public :
     virtual  CCellPhone *  CreatePhone ( )
     {
         CCellPhone  * pPhone  =  new  CSamsung ( ) ;
 
         return  pPhone ;
     }
} ;
 
int  _tmain ( int  argc ,  _TCHAR *  argv [ ])
{
     // Nokia cellphone production line
     CPhoneFactory *  pNokiaFactory  =  new  CNokiaFactory ( ) ;
     CCellPhone *  pNokiaPhone  =  pNokiaFactory -> CreatePhone ( ) ;
     pNokiaPhone -> ProducePhone ( ) ;
 
     // Samsung cellphone production line
     CPhoneFactory *  pSamsungFactory  =  new  CSamsungFactory ( ) ;
     CCellPhone *  pSamsungPhone  =  pSamsungFactory -> CreatePhone ( ) ;
     pSamsungPhone -> ProducePhone ( ) ;
 
     delete  pNokiaPhone ;
     pNokiaPhone  =  NULL ;
 
     delete  pSamsungPhone ;
     pSamsungPhone  =  NULL ;
 
     return  0 ;
}
 
// C#
using  System ;
using  System . Collections . Generic ;
using  System . Text ;
using  System . Diagnostics ;
 
 
namespace  Phone
{
     public  class  CellPhone
     {
         public  virtual  void  ProducePhone ( )
         {
              Console . WriteLine ( " Produce Normal Phone. " ) ;
         }
     }
 
     class  Nokia  :  CellPhone
     {
         public  override  void  ProducePhone ( )
         {
              Console . WriteLine ( " Produce Nokia Phone. " ) ;
         }
     }
 
     class  Samsung  :  CellPhone
     {
         public  override  void  ProducePhone ( )
         {
              Console . WriteLine ( " Produce Samsung Phone. " ) ;
         }
     }
 
     public  interface  IFactory
     {
         CellPhone  CreatePhone ( ) ;
     }
 
     public  class  NokiaFactory  :  IFactory
     {
         public  CellPhone  CreatePhone ( )
         {
              CellPhone  phone  =  new  Nokia ( ) ;
 
              return  phone ;
         }
     }
 
     public  class  SamsungFactory  :  IFactory
     {
         public  CellPhone  CreatePhone ( )
         {
              CellPhone  phone  =  new  Samsung ( ) ;
 
              return  phone ;
         }
     }
 
     class  Program
     {
         static  void  Main ( string [ ]  args )
         {
              IFactory  nokiaFactory  =  new  NokiaFactory ( ) ;
              CellPhone  phone  =  nokiaFactory . CreatePhone ( ) ;
              phone . ProducePhone ( ) ;
 
              IFactory  samsungFactory  =  new  SamsungFactory ( ) ;
              phone  =  samsungFactory . CreatePhone ( ) ;
              phone . ProducePhone ( ) ;
         }
     }
}
 
 
package  CellPhone;
 
public  interface  IFactory {
 
     IPhone  createPhone();
}
 
package  CellPhone;
 
public  interface  IPhone {
 
     void  producePhone();
    
}
 
package  CellPhone;
 
public  class  NokiaFactory  implements  IFactory {
 
     public  IPhone  createPhone()
    {
         IPhone  phone  =  new  NokiaPhone();
        
         return  phone;
    }
}
 
package  CellPhone;
 
public  class  NokiaPhone  implements  IPhone {
 
     public  void  producePhone()
    {
         System. out. println( "Produce nokia phone.");
    }
}
 
package  CellPhone;
 
public  class  SamsungFactory  implements  IFactory {
 
     public  IPhone  createPhone()
    {
         IPhone  phone  =  new  SamsungPhone();
        
         return  phone;
    }
}
 
package  CellPhone;
 
public  class  SamsungPhone  implements  IPhone {
 
     public  void  producePhone()
    {
         System. out. println( "Produce samsung phone.");
    }
}
 
/**
 * CellPhone.java
 */
package  CellPhone;
 
/**
 *  @author  feihe027 @163 .com
 *
 */
 
public  class  CellPhone {
 
     /**
     *  @param  args
     */
     public  static  void  main( String[]  args) {
         // TODO Auto-generated method stub
         IFactory  factory  =  new  NokiaFactory();
         IPhone  phone  =  factory. createPhone();
         phone. producePhone();
        
         factory  =  new  SamsungFactory();
         phone  =  factory. createPhone();
         phone. producePhone();
    }
 
}
 
 

 

缺点

  1. 优点,能够最大限度地保证对修改关闭,对扩展开放。新的产品,都是通过新添加代码来完成而不是去修改原有代码来完成。
  1. 缺点,每添加一个新产品,就新建一个工厂,稍显有点浪费。如果工厂过多,管理工厂也会成为一件麻烦事。抽象工厂模式正好解决这一问题。

 

参考资料

  1. 《设计模式——可复用面向对象软件基础》
  1. Java与模式》
  1. 《大话设计模式》

你可能感兴趣的:(设计模式2——创建型模式之工厂方法模式)