当前位置: 首页 > 编程日记 > 正文

设计模式之抽象工厂模式(Abstract Factory)摘录

面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling).

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。

创建型模式包括:1、FactoryMethod(工厂方法模式);2、Abstract Factory(抽象工厂模式);3、Singleton(单例模式);4、Builder(建造者模式);5、Prototype(原型模式).

结构型模式包括:6、Bridge(桥接模式);7、Adapter(适配器模式);8、Decorator(装饰模式);9、Composite(组合模式);10、Flyweight(享元模式);11、Facade(外观模式);12、Proxy(代理模式).

行为模式包括:13、TemplateMethod(模板方法模式);14、Strategy(策略模式);15、State(状态模式);16、Observer(观察者模式);17、Memento(备忘录模式);18、Mediator(中介者模式);19、Command(命令模式);20、Visitor(访问者模式);21、Chain of Responsibility(责任链模式);22、Iterator(迭代器模式);23、Interpreter(解释器模式).

Factory Method:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。

Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

Builder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

Prototype:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。

Bridge:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

Adapter:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言, Decorator模式比生成子类方式更为灵活。

Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。

Flyweight:运用共享技术有效地支持大量细粒度的对象。

Facade:为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

Proxy:为其他对象提供一个代理以控制对这个对象的访问。

Template Method:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

Strategy:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

State:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。

Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

Memento:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

Mediator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

Visitor:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

Chain of Responsibility:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

Iterator:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。

Interpreter:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。

 Abstract Factory:(1)、意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类;(2)、适用性:一个系统要独立于它的产品的创建、组合和表示时;一个系统要由多个产品系列中的一个来配置时;当你要强调一系列相关的产品对象的设计以便进行联合使用时;当你提供一个产品类库,而只想显示它们的接口而不是实现时;(3)、优缺点:它分离了具体的类;它使得易于交换产品系列;它有利于产品的一致性;难以支持新种类的产品。

Abstract Factory类通常用工厂方法(Factory Method)实现,但它们也可以用Prototype实现。一个具体的工厂通常是一个单件(Singleton)。

示例代码1:

#include <string>
#include <iostream>
#include <vector>using namespace std;//用户抽象接口
class IUser
{
public:virtual void GetUser() = 0;virtual void InsertUser() = 0;
};//部门抽象接口
class IDepartment
{
public:virtual void GetDepartment() = 0;virtual void InsertDepartment() = 0;
};//ACCESS 用户
class CAccessUser : public IUser
{
public:virtual void GetUser() {cout<<"Access GetUser"<<endl;}virtual void InsertUser(){cout<<"Access InsertUser"<<endl;}
};//ACCESS 部门
class CAccessDepartment : public IDepartment
{
public:virtual void GetDepartment(){cout<<"Access GetDepartment"<<endl;}virtual void InsertDepartment(){cout<<"Access InsertDepartment"<<endl;}
};//SQL 用户
class CSqlUser : public IUser
{
public:virtual void GetUser(){cout<<"Sql GetUser"<<endl;}virtual void InsertUser(){cout<<"Sql InsertUser"<<endl;}
};//SQL 部门
class CSqlDepartment : public IDepartment
{
public:virtual void GetDepartment(){cout<<"Sql GetDepartment"<<endl;}virtual void InsertDepartment(){cout<<"Sql InsertDepartment"<<endl;}
};//抽象工厂
class IFactory
{
public:virtual IUser* CreateUser() = 0;virtual IDepartment* CreateDepartment() = 0;
};//ACCESS 工厂
class AccessFactory : public IFactory
{
public:virtual IUser* CreateUser(){return new CAccessUser();}virtual IDepartment* CreateDepartment(){return new CAccessDepartment();}
};//SQL 工厂
class SqlFactory : public IFactory
{
public:virtual IUser* CreateUser(){return new CSqlUser();}virtual IDepartment* CreateDepartment(){return new CSqlDepartment();}
};//客户端
int main()
{IFactory* factory = new SqlFactory();IUser* user = factory->CreateUser();IDepartment* depart = factory->CreateDepartment();user->GetUser();depart->GetDepartment();/*result:Sql GetUserSql GetDepartment*/return 0;
}

示例代码2:

abstractFactory.h:

#ifndef _ABSTRACTFACTORY_H_
#define _ABSTRACTFACTORY_H_class AbstractProductA;
class AbstractProductB;class AbstractFactory
{
public:virtual ~AbstractFactory();virtual AbstractProductA* CreateProductA() = 0;virtual AbstractProductB* CreateProductB() = 0;protected:AbstractFactory();private:
};class ConcreteFactory1 : public AbstractFactory
{
public:ConcreteFactory1();~ConcreteFactory1();AbstractProductA* CreateProductA();AbstractProductB* CreateProductB();protected:
private:
};class ConcreteFactory2 : public AbstractFactory
{
public:ConcreteFactory2();~ConcreteFactory2();AbstractProductA* CreateProductA();AbstractProductB* CreateProductB();protected:
private:
};#endif//~_ABSTRACTFACTORY_H_

abstractFactory.cpp:

#include "abstractFactory.h"
#include "product.h"#include <iostream>using namespace std;AbstractFactory::AbstractFactory()
{}AbstractFactory::~AbstractFactory()
{}ConcreteFactory1::ConcreteFactory1()
{}ConcreteFactory1::~ConcreteFactory1()
{}AbstractProductA* ConcreteFactory1::CreateProductA()
{return new ProductA1();
}AbstractProductB* ConcreteFactory1::CreateProductB()
{return new ProductB1;
}ConcreteFactory2::ConcreteFactory2()
{}ConcreteFactory2::~ConcreteFactory2()
{}AbstractProductA* ConcreteFactory2::CreateProductA()
{return new ProductA2();
}AbstractProductB* ConcreteFactory2::CreateProductB()
{return new ProductB2();
}

product.h:

#ifndef _PRODUCT_H_
#define _PRODUCT_H_class AbstractProductA
{
public:virtual ~AbstractProductA();protected:AbstractProductA();private:
};class AbstractProductB
{
public:virtual ~AbstractProductB();protected:AbstractProductB();private:
};class ProductA1 : public AbstractProductA
{
public:ProductA1();~ProductA1();protected:
private:
};class ProductA2 : public AbstractProductA
{
public:ProductA2();~ProductA2();protected:
private:
};class ProductB1 : public AbstractProductB
{
public:ProductB1();~ProductB1();protected:
private:
};class ProductB2 : public AbstractProductB
{
public:ProductB2();~ProductB2();protected:
private:
};#endif//~_PRODUCT_H_	

product.cpp:

#include "product.h"#include <iostream>using namespace std;AbstractProductA::AbstractProductA()
{}AbstractProductA::~AbstractProductA()
{}AbstractProductB::AbstractProductB()
{}AbstractProductB::~AbstractProductB()
{}ProductA1::ProductA1()
{cout<<"ProductA1 ..."<<endl;
};ProductA1::~ProductA1()
{}ProductA2::ProductA2()
{cout<<"ProductA2 ..."<<endl;
}ProductA2::~ProductA2()
{}ProductB1::ProductB1()
{cout<<"ProductB1 ..."<<endl;
}ProductB1::~ProductB1()
{}ProductB2::ProductB2()
{cout<<"ProductB2 ..."<<endl;
}ProductB2::~ProductB2()
{}

main.cpp:

#include "abstractFactory.h"#include <iostream>
using namespace std;int main()
{AbstractFactory* cf1 = new ConcreteFactory1();cf1->CreateProductA();cf1->CreateProductB();AbstractFactory* cf2 = new ConcreteFactory2();cf2->CreateProductA();cf2->CreateProductB();/*result:ProductA1 ...ProductB1 ...ProductA2 ...ProductB2 ...*/return 0;
}

抽象工厂模式结构图:

简单工厂模式、工厂方法模式、抽象工厂模式三者之间的区别:

(1)、简单工厂模式:一个工厂类(负责创建所有实例的内部逻辑,此工厂类可以被外界直接调用,此工厂类是个静态类,在客户端无需实例化),一个抽象产品类(所有具体产品类的父类,负责描述所有实例共有的公共接口),多个具体产品类。

(2)、工厂方法模式:一个抽象工厂类,多个具体工厂类(每个具体工厂类只能创建一个具体产品类实例),一个抽象产品类,多个具体产品类。

(3)、抽象工厂模式:一个抽象工厂类,多个具体工厂类(每个具体工厂类可以创建多个具体产品类实例),多个抽象产品类(每个抽象产品类可以派生出多个具体产品类),多个具体产品类。

参考文献:

1、《大话设计模式C++》

2、《设计模式精解----GoF23种设计模式解析》

3、《设计模式----可复用面向对象软件的基础》

GitHub:https://github.com/fengbingchun/Messy_Test

相关文章:

grub设置密码的方法

grub设置密码的方法&#xff1a;一、grub设置明文口令的方法&#xff1a;修改/etc/grub.conf配置文件就可以了.[root RedHat ~] # vi /etc/grub.conf #注&#xff1a;此为链接文件&#xff0c;指向 /boot/grub/grub.conf#boot/dev/hdbdefault0timeout5splashimage(hd0,0)/gr…

web服务器(IIS)的操作步骤

转载于:https://blog.51cto.com/14118520/2335646

微软全球AI总监:Azure AI是OpenAI技术商业化变现唯一、排他性合作方

作者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;7 月 24 日下午&#xff0c;微软在北京举行了媒体交流会。会上&#xff0c;微软全球副总裁&#xff0c;人工智能平台负责人 Eric Boyd 介绍了 Azure AI 近期的最新进展情况&#xff0c;并带…

NYOJ_16_矩形嵌套

有点小坑的严格单调递增序列&#xff0c;主要是排序那里坑了一下。 思路&#xff1a;矩形的嵌套&#xff1f; (a<c&&b<d)||(a<d&&b<c)? 不&#xff0c;只要在建点时保证a<b&#xff0c;条件就会少一个&#xff0c;直接a<c&&b<…

抢程序员饭碗?自动写代码的Deep TabNine真如此神奇?

作者 | James Vincent等编译 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;在过去的一年中&#xff0c;AI 生成书面文字的能力大大提高。通过扫描庞大的文本数据集&#xff0c;机器学习软件可以生成从短篇小说到歌词的各种令人信服的样本。…

JS 总结之事件循环

众所周知&#xff0c;JavaScript 为了避免复杂&#xff0c;被设计成了单线程。 ⛅️ 任务 单线程意味着所有任务都需要按顺序执行&#xff0c;如果某个任务执行非常耗时&#xff0c;线程就会被阻断&#xff0c;后面的任务需要等上一个任务执行完毕才会进行。而大多数非常耗时的…

设计模式之工厂方法模式(Factory Method)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式包括&#xff1a;1、FactoryMethod(工厂方法模式)&#xff1b;2、Abstract Factory(抽象工厂模式)&#xff1b;3、Singleton(单例模式)&#xff1b;4、Builder(建造者模式)&#xff1b…

SpanBERT:提出基于分词的预训练模型,多项任务性能超越现有模型!

作者 | Mandar Joshi, Danqi Chen, Yinhan Liu, Daniel S. Weld, Luke Zettlemoyer, Omer Levy译者 | Rachel责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】本文提出了一个新的模型预训练方法 SpanBERT &#xff0c;该方法能够更好地表示和预测…

XP与Windows 7(Win7)等操作系统Ghost备份

XP与Windows 7&#xff08;Win7&#xff09;等操作系统Ghost备份 2013年5月5日 前提&#xff1a;备份还原win7的话&#xff0c;此种Ghost备份方法只针对没有100MB保留分区的win7安装方式。去掉100MB的方法可以参考《Windows7&#xff08;win7&#xff09;系统重装与破解》&…

SSE4.1和SSE4.2 Intrinsics各函数介绍

SIMD相关头文件包括&#xff1a; //#include <ivec.h>//MMX //#include <fvec.h>//SSE(also include ivec.h) //#include <dvec.h>//SSE2(also include fvec.h)#include <mmintrin.h> //MMX #include <xmmintrin.h> //SSE(include mmintrin.h) #…

Nacos v0.7.0:对接CMDB,实现基于标签的服务发现能力

Nacos近期发布了0.7.0版本&#xff0c;该版本支持对接第三方CMDB获取CMDB数据、使用Selector机制来配置服务的路由类型、支持单机模式使用MySQL数据库、上线Node.js客户端&#xff0c;并修复了一些bug。对接CMDB实现就近访问在服务进行多机房或者多地域部署时&#xff0c;跨地域…

数十篇推荐系统论文被批无法复现:源码、数据集均缺失,性能难达预期

作者 | Maurizio Ferrari Dacrema译者 | 凯隐责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】来自意大利米兰理工大学的 Maurizio 团队近日发表了一篇极具批判性的文章&#xff0c;剑指推荐系统领域的其他数十篇论文&#xff0c;指出这些论文中基…

crontab 总结

2019独角兽企业重金招聘Python工程师标准>>> 1.写法 每三天执行一次&#xff1a;0 0 */3 * * root command&#xff0c;注意&#xff1a;* * */3 * * root command 这样写是不对的。其它每N小时执行一次也类似 &#xff08;后续补充&#xff09; 转载于:https://…

ubuntu安装thrift

ubuntu环境下安装thrift-0.10.0 1.解压 2.编译安装 ./configure -with-cpp -with-boost -without-python -without-csharp -with-java -without-erlang -without-perl -with-php -without-php_extension -without-ruby -without-haskell -without-go make sudo make install3.是…

AES(Advanced Encryption Standard) Intrinsics各函数介绍

AES为高级加密标准&#xff0c;是较流行的一种密码算法。 SIMD相关头文件包括&#xff1a; //#include <ivec.h>//MMX //#include <fvec.h>//SSE(also include ivec.h) //#include <dvec.h>//SSE2(also include fvec.h)#include <mmintrin.h> //MMX #…

轻松应对Java试题,这是一份大数据分析工程师面试指南

作者 | HappyMint转载自大数据与人工智能&#xff08;ai-big-data&#xff09;导语&#xff1a;经过这一段时间与读者的互动与沟通&#xff0c;本文作者发现很多小伙伴会咨询面试相关的问题&#xff0c;特别是即将毕业的小伙伴&#xff0c;所以决定输出一系列面试相关的文章。本…

【Elasticsearch 5.6.12 源码】——【3】启动过程分析(下)...

版权声明&#xff1a;本文为博主原创&#xff0c;转载请注明出处&#xff01;简介 本文主要解决以下问题&#xff1a; 1、ES启动过程中的Node对象都初始化了那些服务&#xff1f;构造流程 Step 1、创建一个List暂存初始化失败时需要释放的资源&#xff0c;并使用临时的Logger对…

C++中的封装、继承、多态

封装(encapsulation)&#xff1a;就是将抽象得到的数据和行为(或功能)相结合&#xff0c;形成一个有机的整体&#xff0c;也就是将数据与操作数据的源代码进行有机的结合&#xff0c;形成”类”&#xff0c;其中数据和函数都是类的成员。封装的目的是增强安全性和简化编程&…

比尔盖茨护犊子 称iPad让大批用户沮丧

为什么80%的码农都做不了架构师&#xff1f;>>> 在5月6日接受美国CNBC电视台访问时&#xff0c;微软前任掌门人比尔盖茨维护了自家反响不那么好的Surface系列平板电脑&#xff0c;同时他还不忘吐槽了一把iPad。 当 谈到日渐颓败的PC市场时&#xff0c;盖茨称平板电…

小心陷阱:二维动态内存的不连续性

void new_test() {int** pp;pp new int*[10];for(int i0; i<10; i){pp[i] new int[10];}//pp[0], pp[1], ... , pp[9]在内存中连续;//a1 pp[0][0], pp[0][1], ... , pp[0][9]在内存中也是连续的;//a2 pp[1][0], pp[1][1], ... , pp[1][9]在内存中也是连续的;//...//a9 …

超酷炫!Facebook用深度学习和弱监督学习绘制全球精准道路图

作者 | Saikat Basu等译者 | 陆离责编 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;导读&#xff1a;现如今&#xff0c;即使可以借助卫星图像和绘制软件&#xff0c;创建精确的道路图也依然是一个费时费力的人力加工过程。许多地区&#xff0c;特别是在发…

npm包发布记录

下雪了&#xff0c;在家闲着&#xff0c;不如写一个npm 包发布。简单的 npm 包的发布网上有很多教程&#xff0c;我就不记录了。这里记录下&#xff0c;一个复杂的 npm 包发布&#xff0c;复杂指的构建环境复杂。 整个工程使用 rollup 来构建&#xff0c;其中会引进 babel 来转…

设计模式之单例模式(Singleton)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式包括&#xff1a;1、FactoryMethod(工厂方法模式)&#xff1b;2、Abstract Factory(抽象工厂模式)&#xff1b;3、Singleton(单例模式)&#xff1b;4、Builder(建造者模式)&#xff1…

关于知识蒸馏,这三篇论文详解不可错过

作者 | 孟让转载自知乎导语&#xff1a;继《从Hinton开山之作开始&#xff0c;谈知识蒸馏的最新进展》之后&#xff0c;作者对知识蒸馏相关重要进行了更加全面的总结。在上一篇文章中主要介绍了attention transfer&#xff0c;FSP matrix和DarkRank&#xff0c;关注点在于寻找不…

设计模式之建造者模式(生成器模式、Builder)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式包括&#xff1a;1、FactoryMethod(工厂方法模式)&#xff1b;2、Abstract Factory(抽象工厂模式)&#xff1b;3、Singleton(单例模式)&#xff1b;4、Builder(建造者模式、生成器模式…

[置顶] webservice系列2---javabeanhandler

摘要&#xff1a;本节主要介绍以下两点&#xff0c;1.带javabean的webservice的开发和调用 2.handler的简单介绍及使用1.引言在之前的一篇博客webservice系列1---基于web工程上写一个基本数据类型的webservice中介绍了如何采用axis1.4来完成一个简单的webservice的开发流程(入参…

AI教育公司物灵科技完成战略融资,商汤科技投资

1月2日消息&#xff0c;从相关媒体报道&#xff0c;AI教育公司物灵科技近日完成了商汤的战略融资&#xff0c;本轮融资将用于产品迭代和扩大市场。 此前投资界曾报道&#xff0c;物灵科技已经获得1.5亿元Pre-A轮融资&#xff0c;当时具体资方未透露。 公开资料显示&#xff0…

Python之父发文,将重构现有核心解析器

原题 | PEG Parsers作者 | Guido van Rossum译者 | 豌豆花下猫转载自 Python猫&#xff08;ID: python_cat&#xff09; 导语&#xff1a;Guido van Rossum 是 Python 的创造者&#xff0c;虽然他现在放弃了“终身仁慈独裁者”的职位&#xff0c;但却成为了指导委员会的五位成员…

全面支持三大主流环境 |百度PaddlePaddle新增Windows环境支持

2019独角兽企业重金招聘Python工程师标准>>> PaddlePaddle作为国内首个深度学习框架&#xff0c;最近发布了更加强大的Fluid1.2版本, 增加了对windows环境的支持&#xff0c;全面支持了Linux、Mac、 windows三大环境。 PaddlePaddle在功能完备的基础上&#xff0c;也…

设计模式之原型模式(Prototype)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式包括&#xff1a;1、FactoryMethod(工厂方法模式)&#xff1b;2、Abstract Factory(抽象工厂模式)&#xff1b;3、Singleton(单例模式)&#xff1b;4、Builder(建造者模式、生成器模式…