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:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。

Factory Method:(1)、意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类;(2)、适用性:当一个类不知道它所必须创建的对象的类的时候;当一个类希望由它的子类来指定它所创建的对象的时候;当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

示例代码1:

#include <string>
#include <iostream>using namespace std;//实例基类,相当于Product(为了方便,没用抽象)
class LeiFeng
{
public:virtual void Sweep(){cout<<"雷锋扫地"<<endl;}
};//学雷锋的大学生相当于ConcreteProduct
class Student : public LeiFeng
{
public:virtual void Sweep(){cout<<"大学生扫地"<<endl;}
};//学雷锋的志愿者,相当于ConcreteProduct
class Volenter : public LeiFeng
{
public:virtual void Sweep(){cout<<"志愿者扫地"<<endl;}
};//工厂基类 Creator
class LeiFangFactory
{
public:virtual LeiFeng* CreateLeiFeng(){return new LeiFeng();}
};//工厂具体类
class StudentFactory : public LeiFangFactory
{
public:virtual LeiFeng* CreateLeiFeng(){return new Student();}
};class VolenterFactory : public LeiFangFactory
{
public:virtual LeiFeng* CreateLeiFeng(){return new Volenter();}
};//客户端
int main()
{LeiFangFactory* sf = new LeiFangFactory();LeiFeng *s = sf->CreateLeiFeng();s->Sweep();delete s;delete sf;/*result:雷锋扫地 */return 0;
}

示例代码2:

product.h:

#ifndef _PRODUCT_H_
#define _PRODUCT_H_class Product
{
public:virtual ~Product() = 0;
protected:Product();
private:
};class ConcreteProduct : public Product
{
public:~ConcreteProduct();ConcreteProduct();protected:
private:
};#endif// ~_PRODUCT_H_

product.cpp:

#include "product.h"#include <iostream>
using namespace std;Product::Product()
{}Product::~Product()
{}ConcreteProduct::ConcreteProduct()
{cout<<"ConcreteProduct ..."<<endl;
}ConcreteProduct::~ConcreteProduct()
{}

factory.h:

#ifndef _FACTORY_H_
#define _FACTORY_H_class Product;class Factory
{
public:virtual ~Factory() = 0;virtual Product* CreateProduct() = 0;
protected:Factory();
private:
};class ConcreteFactory : public Factory
{
public:~ConcreteFactory();ConcreteFactory();Product* CreateProduct();
protected:
private:
};#endif//~_FACTORY_H_

factory.cpp:

#include "factory.h"
#include "product.h"#include <iostream>
using namespace std;Factory::Factory()
{}Factory::~Factory()
{}ConcreteFactory::ConcreteFactory()
{cout<<"ConcreteFactory ..."<<endl;
}ConcreteFactory::~ConcreteFactory()
{}Product* ConcreteFactory::CreateProduct()
{return new ConcreteProduct();
}

main.cpp:

#include "factory.h"
#include "product.h"#include <iostream>
using namespace std;int main()
{Factory* fac = new ConcreteFactory();Product* p = fac->CreateProduct();/*result:ConcreteFactory ...ConcreteProduct ...*/return 0;
}

工厂方法模式结构图:

简单工厂模式、工厂方法模式、抽象工厂模式三者之间的区别:
(1)、简单工厂模式:一个工厂类(负责创建所有实例的内部逻辑,此工厂类可以被外界直接调用,此工厂类是个静态类,在客户端无需实例化),一个抽象产品类(所有具体产品类的父类,负责描述所有实例共有的公共接口),多个具体产品类。
(2)、工厂方法模式:一个抽象工厂类,多个具体工厂类(每个具体工厂类只能创建一个具体产品类实例),一个抽象产品类,多个具体产品类。
(3)、抽象工厂模式:一个抽象工厂类,多个具体工厂类(每个具体工厂类可以创建多个具体产品类实例),多个抽象产品类(每个抽象产品类可以派生出多个具体产品类),多个具体产品类。

参考文献:

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

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

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

设计模式之工厂方法模式(Factory Method)摘录相关推荐

  1. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  2. 设计模式之工厂方法模式---factory method

    模式的介绍 模式的定义 Define an interface for creating an object,but let subclassed decide which class to inst ...

  3. 设计模式之工厂方法模式(Factory Method Pattern)

    一.工厂方法模式的诞生 在读这篇文章之前,我先推荐大家读<设计模式之简单工厂模式(Simple Factory Pattern)>这篇文档.工厂方法模式是针对简单工厂模式中违反开闭原则的不 ...

  4. 设计模式题目-工厂方法模式(Factory Method)

    设计一个程序来读取多种不同存储格式的图片,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF格式图片读取器(GifReader)用于读取GIF格式的图片,JPEG格式图片读取器 ...

  5. 工厂方法模式(Factory Method)简介

    工厂方法模式 名字 跟已经介绍的 简单工厂模式很类似. 实际上它们的模型也是十分相似的. 我们先看看工厂模式的定义. 一. 工厂方法(Factory Method)模式定义 教材上是这样写的: 工厂方 ...

  6. 设计模式之六:工厂方法模式(Factory method Pattern)

    工厂方法(Factory Method)模式就是定义一个创建对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责具体产品的创建,仅提供了具体工厂子类必须实现的接口,这样核心类成为一个抽象 ...

  7. 浅谈C++设计模式之工厂方法(Factory Method)

    为什么要用设计模式?根本原因是为了代码复用,增加可维护性. 面向对象设计坚持的原则:开闭原则(Open Closed Principle,OCP).里氏代换原则(Liskov Substitution ...

  8. 软件工程 - 设计模式学习之工厂方法模式Factory Method

    在现实生活中我们可以看见,乐事在卖薯片,可比克也在卖. 我敢肯定的说它们各自都有自己的工厂来生产薯片,而且生产出来的薯片味道还是不一样的. 这就是我们这里所谓的工厂方法模式. 我们来看看这个模式的UM ...

  9. C++实现工厂方法模式Factory Method Pattern

    设计原则6:要依赖抽象,不要依赖具体类.(又称依赖倒置原则Dependency Inversion Principle) 不能让高层组件依赖低层组件,而且,不管高层组件或低层组件,两者都应该依赖于抽象 ...

最新文章

  1. 识别TLS加密恶意流量
  2. Spring利用JDBCTemplate实现批量插入和返回id
  3. 验证用户身份Filter过滤器
  4. 伪类的使用之如何在一段文字前面添加一个点
  5. 优化PhoneGAP的Splashscreen 类
  6. P3793-由乃救爷爷【分块,ST表】
  7. 13 | 线性排序:如何根据年龄给100万用户数据排序?
  8. 福建省高等学校非计算机考试大纲,福建省高等学校计算机应用水平等级考试三级(偏软)考试大纲...
  9. Cookie与Session的联系与区别
  10. 1.7编程基础之字符串
  11. 远程下层文档 正在打印_长宁打印机随叫随到,送货上门
  12. 关于忘记MySQL的root用户密码的问题
  13. groupby java_Java8的groupBy实现集合的分组
  14. 直播软件APP源码,一套完整的直播软件源码解决方案
  15. 李想:“做正确的事,不做容易的事”
  16. 决策树分类算法三种方式
  17. 最超值的Mac——Mac mini
  18. 《计算机网络(计算机)》
  19. openEuler操作系统的安装
  20. 关于Div半透明子元素不透明的问题

热门文章

  1. 【面向对象编程】(1) 类实例化的基本方法
  2. 判断文件或文件夹(目录)是否存在 C/C++ win/linux通用
  3. android 轮播 中间变大,如何实现中间大两头小的轮播效果
  4. linux上查看网络限制,如何在Linux上限制网络带宽
  5. Qt创建多线程的步骤
  6. 设置VSCode打开键盘快捷方式和键盘快捷方式配置JSON分别快捷键为:Ctrl+Alt+K和Shift+Alt+K
  7. CSS3重新定义input中呆若木鸡的默认复选框CheckBox和单选框Radio样式
  8. leetcode-440 字典序的第K小数字
  9. s-sar命令(System Activity Reporter系统活动情况报告)
  10. Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分)