阿Sam的设计模式学习笔记----Factory模式(之Simple Factory)

一、 Simple Factory
为了把事情说清楚,为了对自己的学习负责,偶不得不加一个 disgusted 所谓的“前言”。
这里,就先了解一下 Factory Method 模式的老爸 : Simple Factory Simple Factory 属于类的创建型模式,它根据外界给定信息,让 Factory 来制造所需的产品。工厂对象能够生产的具体产品类 (ConcreteProduct) 通常继承同一个父产品类 (Product) ,实现(覆盖)接口方法。 Simple Factory 的基本结构如图:
简单工厂的实质是有一个工厂类根据传入的参数,动态的生成所需的具体产品对象。上图中体现了这个模式的三个角色:
  • 工厂 (Creator ,上图中的 ProductFactory) Simple Facory 的核心,负责创建所需产品对象。
  • 抽象产品 (Product) :所有具体产品类的父类,它负责描述所有实例公共的接口。
  • 具体产品 (Concrete Product) :具体的产品类,工厂所创建的真正实例。
说了半天废话,还是举例实在一点。
A.        定义一个手机抽象类 (Product)
classMobile 
{
public :
    virtual 
void  call()  =   0 //  Make a call
    virtual  void  shortMsg()  =   0 // Send adn receive short message
};
B.        2 个具体的产品( Concrete Product --Nokia Moto 的手机
class  NokiaPhone : publicMobile
{
    virtual 
void  call() { cout << " Nokia calling " << endl; }
    virtual 
void  shortMsg() { cout  <<   " Nokia short message "   <<  endl; }
};
 
class  MotoPhone : publicMobile
{
    virtual 
void  call() { cout  <<   " Moto calling " << endl; }
    virtual 
void  shortMsg() { cout  <<   " Moto short message "   <<  endl; }
};
C.        接下来是买手机过程类,相当于一个 Factory;
class  MobileShop
{
public :
    Mobile 
*  buyPhone(string brand);
    
void  returnPhone( Mobile  *  phone);  // 最好有一个销毁产品的方法。
};
 
Mobile 
*  MobileShop:: buyPhone(string brand)
{
    
if  (brand  ==   " Moto " )
        
return  ( new  MotoPhone());
    
if  (brand  ==   " Nokia " )
        
return  ( new  NokiaPhone());
    
else
    {
        cout 
<<   " No such brand " <<  endl;
        
return  NULL;
    }
}
 
void  MobileShop::returnPhone(Mobile  * phone)
{
    
if  (phone  !=  NULL)
        delete(phone);
    
return ;
}
D.       现在各种角色都齐了,如果一个客户想买一个手机,就可以这样:
int  main()
{
    MobileShop shop;
    Mobile 
*  nokia  =  shop.buyPhone( " Nokia " );
    Mobile 
*  moto  =  shop.buyPhone( " Moto " );
    //现在用手机打电话,发短信 
    nokia
-> call();
    nokia
-> shortMsg();
    moto
-> call();
    moto
-> shortMsg();
    shop.returnPhone(nokia);
    shop.returnPhone(moto);
}
 
由上面的代码示例可以看出:
1.  客户想要购买一个手机(生产一个产品),就找手机商店( MobileShop ),告诉商店要 Moto 的手机还是 Nokia 的。
2.  商店必须知道它有哪些牌子的商品,如何创建这些商品。如果商店希望提供新的牌子(例如 SonyEricsson )的产品,必须修改商店,在 buyMobile 方法中新添 SonyEricsson 的生产过程。

你可能感兴趣的:(阿Sam的设计模式学习笔记----Factory模式(之Simple Factory))