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

本文介绍了简单工厂模式的概念及其应用,通过具体的代码示例展示了如何利用简单工厂模式来创建不同的手机对象,包括Nokia和Moto品牌的手机。文章还讨论了简单工厂模式的优缺点,并解释了如何扩展该模式以支持更多品牌。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Simple Factory
为了把事情说清楚,为了对自己的学习负责,偶不得不加一个disgusted所谓的“前言”。
这里,就先了解一下Factory Method模式的老爸: Simple FactorySimple 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--NokiaMoto的手机
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的生产过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值