抽象工厂模式

抽象工厂模式的概念

抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向 客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品 族的产品对象

抽象工厂的角色及其职责

  1. 抽象工厂(Creator)角色 抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
  2. 具体工厂( Concrete Creator)角色 具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
  3. 抽象(Product)角色 抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
  4. 具体产品(ConcreteProduct)角色 抽象模式所创建的具体实例对象

产品组和产品等级结构

工厂模式:要么生产香蕉,要么生产苹果、要么生产西红柿;但是不能同时生产一 个产品组。抽象工厂:能同时生产一个产品族
而抽象工厂模式就可以生产一个产品族

产品等级结构:

生产香蕉。苹果。梨子。但是每种水果都有不同的等级,有的好吃,有的难吃。

产品族

南方香蕉/苹果/梨子(这是一个产品组)
北方香蕉/苹果/梨子 (这是另外一个产品族)

抽象工厂模式的实现

#include<iostream>
using namespace std;//抽象苹果
class AbstractApple{
public:virtual void ShowName() = 0;
};//中国苹果
class ChinaApple :public AbstractApple{
public:virtual void ShowName(){cout << "中国苹果" << endl;}
};class USAApple :public AbstractApple{
public:virtual void ShowName(){cout << "美国苹果" << endl;}
};
class JapanApple :public AbstractApple{
public:virtual void ShowName(){cout << "日本苹果" << endl;}
};
//抽象香蕉
class AbsrtactBanana{
public:virtual void ShowName() = 0;
};//中国香蕉
class ChinaBanana :public AbsrtactBanana{
public:virtual void ShowName(){cout << "中国香蕉" << endl;}
};
class USABanana :public AbsrtactBanana{
public:virtual void ShowName(){cout << "美国香蕉" << endl;}
};
class JapanBanana :public AbsrtactBanana{
public:virtual void ShowName(){cout << "日本香蕉" << endl;}
};//抽象的梨子
class AbsrtactPear{
public:virtual void ShowName() = 0;
};//中国梨子
class ChinaPear :public AbsrtactPear{
public:virtual void ShowName(){cout << "中国梨子" << endl;}
};
//美国梨子
class USAPear :public AbsrtactPear{
public:virtual void ShowName(){cout << "美国梨子" << endl;}
};
//日本梨子
class JapanPear :public AbsrtactPear{
public:virtual void ShowName(){cout << "日本梨子" << endl;}
};//抽象工厂   针对产品族
class AbstractFactoty{
public:virtual AbstractApple *CreateApple() = 0;virtual AbsrtactBanana *CreateBanana() = 0;virtual AbsrtactPear* CreatePear() = 0;
};//中国工厂
class ChinaFactory :public AbstractFactoty{
public:virtual AbstractApple *CreateApple(){return new ChinaApple;}virtual AbsrtactBanana *CreateBanana(){return new ChinaBanana;}virtual AbsrtactPear* CreatePear() {return new ChinaPear;}
};
//美国工厂
class USAFactory :public AbstractFactoty{
public:virtual AbstractApple *CreateApple(){return new USAApple;}virtual AbsrtactBanana *CreateBanana(){return new USABanana;}virtual AbsrtactPear* CreatePear() {return new USAPear;}
};
//日本工厂
class JapanFactory :public AbstractFactoty{
public:virtual AbstractApple *CreateApple(){return new JapanApple;}virtual AbsrtactBanana *CreateBanana(){return new JapanBanana;}virtual AbsrtactPear* CreatePear() {return new JapanPear;}
};void test01(){AbstractFactoty *factory = NULL;AbstractApple *apple = NULL;AbsrtactBanana *banana = NULL;AbsrtactPear *pear = NULL;//中国工厂factory = new ChinaFactory; apple = factory->CreateApple();banana = factory->CreateBanana();pear = factory->CreatePear();apple->ShowName();banana->ShowName();pear->ShowName();delete apple;delete banana;delete pear;
}int main(void){test01();system("pause");return 0;
}

设计模式---4(抽象工厂模式的概念,产品组和产品等级的概念,抽象工厂模式的实现)相关推荐

  1. 【设计模式】抽象工厂模式 ( 简介 | 适用场景 | 优缺点 | 产品等级结构和产品族 | 代码示例 )

    文章目录 一.抽象工厂模式简介 二.抽象工厂模式适用场景 三.抽象工厂模式优缺点 四.产品等级结构和产品族 五.抽象工厂模式代码示例 1.冰箱抽象类 2.美的冰箱实现类 3.格力冰箱实现类 4.空调抽 ...

  2. java 反射 工厂模式_Java反射机制demo(七)—反射机制与工厂模式

    Java反射机制demo(七)-反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...

  3. 工厂模式:一个即可简单实现,又可复杂实现的模式

    点击上方「蓝字」关注我们 工厂模式的实现主要分为三种,分别是简单工厂模式(Simple Factory).工厂方法模式(Factory Method)和抽象工厂模式(Abastract Factory ...

  4. 【转载】周鸿祎:做产品体验先把自己切换到二傻子模式

    我唯一能自吹的地方,就是本人在互联网里可能犯的错最多,挨的骂最多,然后也经历了很多失败,所以这样才有一些真实的感受. 建议大家把<定位>和<创新者的窘境>.<创新者的解答 ...

  5. java为什么用工厂模式_【Java】为什么建议没事不要随便用工厂模式创建对象?...

    一般情况下,工厂模式分为三种更加细分的类型:简单工厂.工厂方法和抽象工厂.在这三种细分的工厂模式中,简单工厂.工厂方法原理比较简单,在实际的项目中也比较常用.而抽象工厂的原理稍微复杂点,在实际的项目中 ...

  6. 【1016】从产品创意到产品概念

    这篇文章,仍然是 <客户需求驱动的产品定义和规划> 培训记录的一部分,分享的是产品早期阶段的过程:这是一个确定方向(产品创意 ),从问题出发,发现潜在解决方案(产品概念 )的过程.主要分为 ...

  7. 社交产品盈利方式产品模式设计案例

    移动社交app产品用户群体广泛且基数巨大,但是具有移动社交属性的产品,都还未真正确立一个明确方向实现规模化的持续性盈利. 移动社交产品在现阶段主要有几大盈利方式,让我们逐个来数一数: 1 会员收费模式 ...

  8. 网络变压器是干什么用的?(以太网 网络 LAN 局域网 通讯隔离滤波器)生产工厂/产品原理图/常用产品/价格影响因素

    Hqst盈盛(华强盛)电子导读:今天我们来从各个方面系统的各个纬度的来全面的谈谈网络变压器这个产品 网络变压器(以太网 网络 LAN 局域网 通讯隔离滤波器) 网络变压器是干什么用的 在网络通讯主板上 ...

  9. 网页访问服务器默认什么端口号,URL中没有端口号默认为80?详解IT产品必须熟知的访问地址概念!...

    原标题:URL中没有端口号默认为80?详解IT产品必须熟知的访问地址概念! 作为一个互联网产品经理,你可能每天打开几十个网页,但你有没有观察过他们的网址? 作者带你庖丁解牛并把网址拆开.标准URL地址 ...

最新文章

  1. 《大话数据结构》第9章 排序 9.9 快速排序(下)
  2. Balanced Team
  3. bind-utils.x86_64(dig) 安装失败解决办法
  4. 云钻还在吗 苏宁怎么解除实名认证_快手7天怎么养号,5步简易养号方案送上
  5. 大学学了一个学期的 C 语言,我们应该明白哪些知识点?别像没学一样!
  6. SSIM与MS-SSIM图像评价函数
  7. FPGA UART总线协议简介
  8. 基于JQuery做的一个简单的点击显示和隐藏的小Demo
  9. ASP.NET MVC Bootstrap极速开发框架
  10. 安全组规则跨region导入导出功能介绍
  11. 光线如何从宇宙黑暗时代逃逸:黑洞让宇宙变光明
  12. 使用axis2 services.xml 发布web service
  13. OpenCV统计应用-CvHistogram直方图资料
  14. CSS盒模型的2个误区
  15. 互联网的起源发展历史
  16. lol1月8日服务器维护,lol测试服1月8日更新公告
  17. 【Word】长文档排版
  18. VSCode 居然是个娱乐软件?让你 high 到爆的几款插件
  19. docker 简单教程
  20. EDA软件—Cadence学习笔记分享(内含安装教程)

热门文章

  1. Linux系统下,MySQL以及禅道的安装/卸载
  2. hibernate cascade的真正含义
  3. MST:Bad Cowtractors(POJ 2377)
  4. STL中的lower_bound和upper_bound的理解
  5. Constructor总结
  6. c#中接口的使用方法图解_c# 接口方法中使用new有什么用?
  7. python图形化编程实验_转换图像RGB-实验室与python
  8. fedora 不在sudoers文件中_COPR 仓库中 4 个很酷的新软件(2019.4) | Linux 中国
  9. arcgis已试图对空几何执行该操作_ArcGIS中地理配准与空间校正的不同
  10. android 自定义switch控件,Android中switch自定义样式