设计模式之工厂方法

意图

定义一个创建对象的接口
让子类决定创建哪个

  • 当一个类不知道它所必须创建的对象的类的时候
  • 将创建对象的职责委托给子类,由一个多个子类中的一个来创建

组成

  • 产品角色 product 接口
  • 具体产品角色 concreteproduct 具体的产品生产
  • 工厂角色 Factory 返回一个Product
  • 具体工厂角色ConcreteFactory 重定义Factory, 返回ConreteProduct实例
    Created with Raphaël 2.1.0 factory factory concretefactory concretefactory

client 创建具体工厂A,具体工厂A创建具体的产品a;
不同的工厂创建对应的产品, 如飞机工厂创建飞机, 坦克工厂生产坦克;

// now weapons need to make, such as tank, battleplane...
// use factory method, we need the:
//1. abstract factory,  concretefactory(for producting concrete weapons: airplanefactory, tankfactory);
//2. abstract product, concreteproduct
// client use factory to create concreteproducts
class client
{
public: 
    // battleplane 
    AFactroy *afac = new BattleplaneFactory();
    AWeapon  *apro = afac->Product(); // battleplane
    apro->fighting();
    //  tank
    afac = new TankFactory();
    apro = afac->Product();
    apro->fighting();
}
// Abstract factory
class AFactory
{
    public:
    virtual Weapon* Product() = 0;
}
// ConcreteFactory
class BattlePlaneFactory
{
public:
    vitrual Weapon* Product()
    {
    cout<<"BatllePlane is Create!"<<endl;
    return new BattlePlane();  // factory create a plane
    }
}
class TankFactory
{
public:
    virtual Weapon* Product()
    {
    cout<<"Tank is Create!"<<endl;
    return new Tank();
    }
}
// abstract product
class Weapon
{
public:
    virtual void fighting() = 0;
}
// concrete produc
class BattlePlane : public Weapon
{
public:
    virtual void fighting(){
    cout<<"BattlePlane is Create"<<endl;
    }
}
// ...... the tank is same

总结

  • client用户需要使用一种产品, 而该产品有很多类别, 且可能有很多厂商(供应者), 这时就可以考虑使用该模式,;1. 获得具体工厂对象; 2. 制造相应的产品; 3. 使用
  • abstrat factory抽象工厂为使用者提供众多工厂的接口, 比如这些工厂必须能生产所需的物品概况,如房子, 武器..
  • abstrat product抽象产品则是为使用者提供众多产品的具体用法接口,比如房子有:三室, 二室… 武器有飞机, 坦克…, 用户可以使用这些接口去完成一些事,比如: 出租, 打仗
  • concrete factroy具体工厂生产它所能制造出来的武器
  • concrete product具体产品完成它自己的功能
  1. 抽象工厂操作抽象对象,具体工厂得到具体对象;
  2. 工厂产生对象,对象完成具体操作;
  3. 定义了一个创建产品的接口,让产品的实例化延迟到子类;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值