设计模式之抽象工厂
来源:互联网 发布:php 字母a加1 编辑:程序博客网 时间:2024/06/06 10:19
概念:
抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。
模式中包含的角色及其职责:
- 抽象工厂(Creator)角色
抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。- 具体工厂( Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。- 抽象(Product)角色
抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。- 具体产品(Concrete Product)角色
抽象模式所创建的具体实例对象
应用实例:
产品变成了产品族,分为南方北方两个系列。而工厂则根据不同系列生产不同产品,单个系列中有多种产品,所有抽象工厂每种产品的生产方法都得有。
#include <iostream>using namespace std;// 水果的基类class Fruit{public: virtual void MyName() = 0;};class SouthApple:public Fruit{public: virtual void MyName() { cout << "我是 南方的 苹果....." << endl; }};class SouthPear:public Fruit{public: virtual void MyName() { cout << "我是 南方的 梨....." << endl; }};class NorthApple:public Fruit{public: virtual void MyName() { cout << "我是 北方的 苹果....." << endl; }};class NorthPear:public Fruit{public: virtual void MyName() { cout << "我是 北方的 梨....." << endl; }};// 抽象工厂:规定好生产的产品类型,种类先定好class AbsFactory{public: virtual Fruit *CreateApple() = 0; virtual Fruit *CreatePear() = 0;};// 南方的工厂class SouthFactory : public AbsFactory{public: virtual Fruit *CreateApple() { return new SouthApple; } virtual Fruit *CreatePear() { return new SouthPear; }};class NorthFactory : public AbsFactory{public: virtual Fruit *CreateApple() { return new NorthApple; } virtual Fruit *CreatePear() { return new NorthPear; }};void func(AbsFactory *abs){ Fruit *fruit1 = abs->CreateApple(); Fruit *fruit2 = abs->CreatePear(); fruit1->MyName(); fruit2->MyName(); delete fruit1; delete fruit2; delete abs;}int main(){ AbsFactory *abs = NULL; // 想吃南方的水果 abs = new SouthFactory; func (abs); return 0;}
三种工厂模式的区别:
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
阅读全文
0 0
- 设计模式之抽象工厂
- 设计模式 之 抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之-抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式 之 抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 人工智能的最大未解之谜是什么?
- 年历 | IT史上的今天
- bat脚本基本命令
- 除了“剁手”,还要回首
- jQuery方法position()与offset()区别
- 设计模式之抽象工厂
- 【第四届蓝桥杯】振兴中华
- 贴片式SIM卡规格以及封装尺寸信息
- java 发送邮件
- Ionic学习总结
- (树) 101. Symmetric Tree
- error LNK2001: unresolved external symbol _WinMain@16
- ASP.NET中的图片路径问题
- spring整合ehcache 注解实现查询缓存,并实现实时缓存更新或删除