意图
定义一个创建对象的接口
让子类决定创建哪个
- 当一个类不知道它所必须创建的对象的类的时候
- 将创建对象的职责委托给子类,由一个多个子类中的一个来创建
组成
- 产品角色 product 接口
- 具体产品角色 concreteproduct 具体的产品生产
- 工厂角色 Factory 返回一个Product
- 具体工厂角色ConcreteFactory 重定义Factory, 返回ConreteProduct实例
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具体产品完成它自己的功能
- 抽象工厂操作抽象对象,具体工厂得到具体对象;
- 工厂产生对象,对象完成具体操作;
- 定义了一个创建产品的接口,让产品的实例化延迟到子类;