抽象工厂模式
2017-08-20 09:46
120 查看
抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。
对于工厂模式:要么生产香蕉、要么生产苹果、要么生产西红柿;但是不能同时生产多个产品。
抽象工厂:能同时生产一个产品族(多个产品)。===》抽象工厂存在原因
重要区别:
工厂模式只能生产一个产品。(要么香蕉、要么苹果)
抽象工厂可以一下生产一个产品族(里面有很多产品组成)
角色及职责
抽象工厂(Creator)角色
抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
具体工厂( Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。只生产一个具体的产品实例。
抽象产品(Product)角色
抽象工厂模式所创建的所有产品对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色
抽象工厂模式所创建的具体实例对象,里面有具体产品的属性,均继承自抽象产品类,
案例
总结
抽象工厂相比普通的工厂方法模式,在代码上表现为,抽象工厂里面的成员函数变多了,每一个成员函数在具体工厂被重写以后,又都能产生一种具体的产品,所以一个具体工厂便能够产生多个产品的实例。在生活中,便是生产复杂的产品线,比如有几个档次的产品,每个档次里面又有多种不同的产品!而普通工厂方法模式的抽象工厂一般只有一个成员函数,相应的,具体的工厂就只能生产一个单一的产品,适用于产品结构单一的情况!
对于工厂模式:要么生产香蕉、要么生产苹果、要么生产西红柿;但是不能同时生产多个产品。
抽象工厂:能同时生产一个产品族(多个产品)。===》抽象工厂存在原因
重要区别:
工厂模式只能生产一个产品。(要么香蕉、要么苹果)
抽象工厂可以一下生产一个产品族(里面有很多产品组成)
角色及职责
抽象工厂(Creator)角色
抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
具体工厂( Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。只生产一个具体的产品实例。
抽象产品(Product)角色
抽象工厂模式所创建的所有产品对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色
抽象工厂模式所创建的具体实例对象,里面有具体产品的属性,均继承自抽象产品类,
案例
#include<iostream> using namespace std; /*抽象产品--作为抽象工厂的依赖*/ class Fruit { public: virtual void SayName()=0; }; /*抽象工厂--里面有产品线(产品线是固定的,这是缺点)*/ class AbstractFactory { public: virtual Fruit* CreateBanana()=0; virtual Fruit* CreateApple()=0; }; /*具体产品1--北方香蕉*/ class NorthBanana:public Fruit { virtual void SayName() { cout<<"我是北方香蕉"<<endl; } }; /*具体产品2--北方苹果*/ class NorthApple:public Fruit { virtual void SayName() { cout<<"我是北方苹果"<<endl; } }; /*具体产品3--南方香蕉*/ class SouthBanana:public Fruit { virtual void SayName() { cout<<"我是南方香蕉"<<endl; } }; /*具体产品3--南方苹果*/ class SouthApple:public Fruit { virtual void SayName() { cout<<"我是南方苹果"<<endl; } }; /*具体工厂1--北方工厂*/ class NorthFactory:public AbstractFactory { virtual Fruit* CreateBanana() { return new NorthBanana; } virtual Fruit* CreateApple() { return new NorthApple; } }; /*具体工厂2--南方工厂*/ class SouthFactory:public AbstractFactory { virtual Fruit* CreateBanana() { return new SouthBanana; } virtual Fruit* CreateApple() { return new SouthApple; } }; /*测试案例*/ int main261() { Fruit * fruit = NULL;//抽象产品 AbstractFactory *af = NULL;//抽象工厂 af = new SouthFactory;//创建北方工厂 fruit = af->CreateApple();//生产苹果 fruit->SayName(); delete fruit;//内存回收 fruit = af->CreateBanana();//生产香蕉 fruit->SayName(); delete fruit; delete af; af = new NorthFactory;//创建南方工厂 fruit = af->CreateApple();//生产苹果 fruit->SayName(); delete fruit; fruit = af->CreateBanana();//生产香蕉 fruit->SayName(); delete fruit; delete af;//内存回收 return 0; }
总结
抽象工厂相比普通的工厂方法模式,在代码上表现为,抽象工厂里面的成员函数变多了,每一个成员函数在具体工厂被重写以后,又都能产生一种具体的产品,所以一个具体工厂便能够产生多个产品的实例。在生活中,便是生产复杂的产品线,比如有几个档次的产品,每个档次里面又有多种不同的产品!而普通工厂方法模式的抽象工厂一般只有一个成员函数,相应的,具体的工厂就只能生产一个单一的产品,适用于产品结构单一的情况!
相关文章推荐
- 抽象工厂模式(Abstract Factory Pattern)
- .NET简谈设计模式之(抽象工厂模式)
- 艾伟_转载:.NET设计模式:抽象工厂模式(Abstract Factory)
- 抽象工厂模式(Abstract Factory)
- 简单工厂模式 工厂方法模式 抽象工厂模式
- .NET设计模式(3):抽象工厂模式(Abstract Factory)
- C#设计模式之3——抽象工厂模式
- C语言和设计模式(抽象工厂模式)【文章都是来自网络,只要自己吸取了就是自己的】 .
- 抽象工厂模式(Abstract Factory)
- 抽象工厂模式(Abstract Factory Pattern)
- c++设计模式之抽象工厂模式
- 抽象工厂模式
- 设计模式学习-抽象工厂模式
- 大话设计模式-抽象工厂模式
- 抽象工厂模式
- 工厂模式(简单工厂模式, 工厂方法模式, 抽象工厂模式)一
- 女娲与抽象工厂模式
- 用代码和UML图化解设计模式之《抽象工厂模式》
- 7种创建型模式 之3 Abastract Factory 抽象工厂模式 《Java与模式》学习笔记
- C#设计模式系列:抽象工厂模式(AbstractFactory)