Abstract Factory 抽象工厂模式
提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具体实现,创建一组具体的对象。
以下情况可以使用抽象工厂模式:
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
- 当你提供一个产品类库,而只想显示它们的接口而不是实现时。
抽象工厂模式的优缺点:
- 他分离了具体的类
- 它使得易于交换产品系列
- 它有利于产品的一致性
- 难以支持新种类的产品
在实现时最好将工厂作为单件。
如果有多个可能的产品系列,具体工厂也可以使用Prototype原型模式来实现。具体工厂使用产品系列中每一个产品的实例来初始化,且通过复制它的原型来创建新的产品。在基于原型的方法中,使得不是每个新的产品系列都需要一个新的具体工厂类。
定义可扩展的工厂。比如用参数指定将被创建的对象的种类。注意所有的产品都将返回相同类型的抽象接口给用户,可以用dynamic_cast进行类型转换,但是也有可能失败。
- #include <iostream>
- #include <string>
- class AbstractProduct {
- public:
- virtual ~AbstractProduct() {}
- virtual void message() = ;
- };
- class Product : public AbstractProduct {
- virtual ~Product() {}
- virtual void message() {
- std::cout << "我是一个普通的Product" << std::endl;
- }
- };
- class ProductEx : public AbstractProduct {
- virtual ~ProductEx() {}
- virtual void message() {
- std::cout << "我是加强后的Product" << std::endl;
- }
- };
- class AbstractObject {
- public:
- virtual ~AbstractObject() {}
- virtual void gao() = ;
- };
- class Object : public AbstractObject {
- virtual ~Object() {}
- virtual void gao() {
- std::cout << "虽然叫做Object,但是只是一个普通的Object" << std::endl;
- }
- };
- class ObjectEx : public AbstractObject {
- virtual ~ObjectEx() {}
- virtual void gao() {
- std::cout << "虽然叫做ObjectEx好像很厉害的样子,其实还是一个普通的Object" << std::endl;
- }
- };
- class AbstractFactory {
- public:
- virtual AbstractProduct* CreateProduct() = ;
- virtual AbstractObject* CreateObject() = ;
- virtual ~AbstractFactory() {}
- protected:
- AbstractFactory(){}
- AbstractFactory(const AbstractFactory&);
- AbstractFactory& operator=(const AbstractFactory&);
- };
- class ConcreteFactory : public AbstractFactory {
- public:
- virtual AbstractProduct* CreateProduct() {
- return new Product();
- }
- virtual AbstractObject* CreateObject() {
- return new Object();
- }
- static ConcreteFactory* Instance() {
- static ConcreteFactory _instance;
- return &_instance;
- }
- };
- class ExtraFactory : public AbstractFactory {
- public:
- virtual AbstractProduct* CreateProduct() {
- return new ProductEx();
- }
- virtual AbstractObject* CreateObject() {
- return new ObjectEx();
- }
- static ExtraFactory* Instance() {
- static ExtraFactory _instance;
- return &_instance;
- }
- };
测试代码
- #include <iostream>
- #include "Abstract_Factory.h"
- using namespace std;
- int main()
- {
- auto fac = ConcreteFactory::Instance();
- auto pro = fac->CreateProduct();
- auto obj = fac->CreateObject();
- pro->message();
- obj->gao();
- auto facEx = ExtraFactory::Instance();
- auto proEx = facEx->CreateProduct();
- auto objEx = facEx->CreateObject();
- proEx->message();
- objEx->gao();
- system("pause");
- }
测试结果
- 我是一个普通的Product
- 虽然叫做Object,但是只是一个普通的Object
- 我是加强后的Product
- 虽然叫做ObjectEx好像很厉害的样子,其实还是一个普通的Object
- 请按任意键继续. . .
Abstract Factory 抽象工厂模式的更多相关文章
- c++ 设计模式9 (Abstract Factory 抽象工厂模式)
5.2 抽象工厂模式 动机:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 代码示例: 实现利用数据库的业务逻辑,支持多数据库(Sq ...
- 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式
1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...
- Java设计模式:Abstract Factory(抽象工厂)模式
概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品) ...
- 一天一个设计模式——Abstract Factory抽象工厂模式
一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...
- Abstract Factory抽象工厂模式
抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式. 目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法). 使用场景:系统的产品有多于一个的产品族 ...
- 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)
今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...
- 2.设计模式-Abstract Factory 抽象工厂模式
大神勿喷,不对的地方请指出来,学笔记而已. 解决的问题:应对多系列对象构建的变化或多系列(例如:崎岖的山路和平坦的马路属于一个系列) 不断的变化的创建. 使用场景:对象不变(比如有3个对象 " ...
- 设计模式02: Abstract Factory 抽象工厂(创建型模式)
Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题: -实现依赖 ...
- Abstract Factory 抽象工厂(创建型模式)
1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...
随机推荐
- C++实现一个限制对象实例个数的类
http://www.cnblogs.com/absolute8511/archive/2009/03/02/1649603.html
- [置顶] 【Git入门之一】Git是神马?
1.Git是神马? 一个开源的分布式版本控制系统,可以有效的高速的控制管理各种从小到大的项目版本.他的作者就是大名鼎鼎的Linux系统创始人Linus. 2.分布式又是神马? 先看看集中式.简单说来, ...
- eval
字符串形式:表达式计算 Vsftp:/root/perl/14# cat aa 9 5 1 2 Vsftp:/root/perl/14# cat a1.pl open (A,aa); while ($ ...
- Android应用开发性能优化完全分析
1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...
- Linux 日常使用指令大全
001.日常维护常用查询命令 #top 显示系统进程 #clear 清理屏幕信息 #cat /etc/redhat-release 查看系统版本信息 #cat /proc/version ...
- [LeetCode#277] Find the Celebrity
Problem: Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there ma ...
- javascript时间、随机数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 利用if else判断几点是什么时间段
static void Main(string[] args) { while (true) { int a; ...
- 利用switch case 来运行咱们结婚吧
static void Main(string[] args) { while (true) { int x, ...
- 【Android 开源】:最火的Android开源项目 第01期
GitHub在中国的火爆程度无需多言,越来越多的开源项目迁移到GitHub平台上.更何况,基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要.利用这些项目,有时能够让你 ...