设计模式-创建型03-抽象工厂
2013-12-31 16:15
399 查看
一,动机
在工厂方法模式中,具体工厂负责产生具体的产品,每个具体工厂对应一种具体产品。但是有时候,一个工厂需要提供多个产品对象,而不是单一。对于学校,不仅能培养本科生,研究生,还能培养博士生。这个时候,工厂方式模式就显得不够用。
引入两个概念:
1,产品等级结构。即产品的继承结构。所有学校的 本科生,都是一个等级结构。
2,产品族。指同一工厂产生的一组产品。本科生,研究生等就是一个产品族。
二,定义
提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。
三,模式结构
1,Factory(抽象工厂)
规定子工厂的统一接口
2,ConcreteFactory(具体工厂)
实现各个子工厂的具体逻辑。
3,AbstractProduct(抽象产品)
工厂所创建的所有对象的父类
4,[b]Concrete[b]Product(具体产品)[/b][/b]
子工厂创建的具体产品
四,代码实例
输出:
缺点:
在新添加产品对象时,难以扩展抽象工厂来生成新产品。因为抽象工厂中已经规定了产品的接口。要支持新的产品,涉及到对工厂角色的修改
在工厂方法模式中,具体工厂负责产生具体的产品,每个具体工厂对应一种具体产品。但是有时候,一个工厂需要提供多个产品对象,而不是单一。对于学校,不仅能培养本科生,研究生,还能培养博士生。这个时候,工厂方式模式就显得不够用。
引入两个概念:
1,产品等级结构。即产品的继承结构。所有学校的 本科生,都是一个等级结构。
2,产品族。指同一工厂产生的一组产品。本科生,研究生等就是一个产品族。
二,定义
提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。
三,模式结构
1,Factory(抽象工厂)
规定子工厂的统一接口
2,ConcreteFactory(具体工厂)
实现各个子工厂的具体逻辑。
3,AbstractProduct(抽象产品)
工厂所创建的所有对象的父类
4,[b]Concrete[b]Product(具体产品)[/b][/b]
子工厂创建的具体产品
四,代码实例
#include <iostream> using namespace std; class UnderGraduate { public: virtual void Say()=0; }; class PostGraduate { public: virtual void Say()=0; }; class School { public: virtual UnderGraduate* produceUnderGraduate() = 0; virtual PostGraduate* producePostGraduate() = 0; }; class UnderGraduateA: public UnderGraduate { public: void Say() { cout<<"我是AA本科生......很高兴得到聘用"<<endl ; } }; class PostGraduateA: public PostGraduate { public: void Say() { cout<<"我是AA研究生......初次见面,多多关照"<<endl ; } }; class UnderGraduateB: public UnderGraduate { public: void Say() { cout<<"我是BB本科生......很高兴得到聘用"<<endl ; } }; class PostGraduateB: public PostGraduate { public: void Say() { cout<<"我是BB研究生......初次见面,多多关照"<<endl ; } }; class SchoolA : public School { UnderGraduate* produceUnderGraduate() { cout<<"这里是学校AA"<<endl; cout<<"毕业了一个本科生"<<endl; return new UnderGraduateA(); } PostGraduate* producePostGraduate() { cout<<"这里是学校AA"<<endl; cout<<"毕业了一个研究生"<<endl; return new PostGraduateA(); } }; class SchoolB : public School { UnderGraduate* produceUnderGraduate() { cout<<"这里是学校BB"<<endl; cout<<"毕业了一个本科生"<<endl; return new UnderGraduateB(); } PostGraduate* producePostGraduate() { cout<<"这里是学校BB"<<endl; cout<<"毕业了一个研究生"<<endl; return new PostGraduateB(); } }; int main() { School* Sl_test = new SchoolA(); Sl_test->producePostGraduate(); School* Sl_test2 = new SchoolB(); Sl_test2->produceUnderGraduate(); return 0; }
输出:
这里是学校AA 毕业了一个研究生 这里是学校BB 毕业了一个本科生
缺点:
在新添加产品对象时,难以扩展抽象工厂来生成新产品。因为抽象工厂中已经规定了产品的接口。要支持新的产品,涉及到对工厂角色的修改
相关文章推荐
- 设计模式-创建型模式-抽象工厂
- 设计模式——创建型设计模式总结(简单工厂、普通工厂、抽象工厂、建造者、原型和单例)
- 设计模式二:abstract factory 抽象工厂——对象创建型模式
- 【23种设计模式】创建型模式 > 三个工厂模式(简单工厂、抽象工厂、工厂方法)
- 【设计模式】创建型模式-抽象工厂
- 设计模式——创建型设计模式总结(简单工厂、普通工厂、抽象工厂、建造者、原型和单例)
- java设计模式--创建型模式--抽象工厂
- 二十三种设计模式之创建型模式之抽象工厂
- 设计模式-创建型模式:抽象工厂 AbstractFactory
- 一起来学设计模式-----创建型模式之抽象工厂
- 设计模式笔记--创建型模式之一 抽象工厂
- [设计模式03]-抽象工厂
- 【转】设计模式——创建型设计模式总结(简单工厂、普通工厂、抽象工厂、建造者、原型和单例)
- 3、设计模式__创建型__抽象工厂
- PHP中的设计模式-创建型-抽象工厂
- 创建型设计模式(简单工厂,工厂,抽象工厂与单例模式
- 设计模式03:抽象工厂
- 设计模式--创建型--抽象工厂
- Java技术_每天掌握一种设计模式(004)_使用场景及简单实例(创建型:抽象工厂)
- 设计模式-创建型-抽象工厂