目录标题

  • 概述
  • 适用场景
  • 简单工厂模式(Simple Factory)
    • 简单工厂模式简介
    • 简单工厂模式的结构组成
    • 简单工厂模式的特点和优缺点
    • 简单工厂模式的适用场景
    • 简单工厂模式的示例
  • 工厂方法模式
    • 工厂方法模式简介
    • 工厂方法模式的结构组成
    • 工厂方法模式的特点和优缺点
    • 工厂方法模式的适用场景
    • 工厂方法模式的示例
  • 抽象工厂模式
    • 抽象工厂模式模式简介
    • 抽象工厂模式的结构组成
    • 抽象工厂模式的特点和优缺点
    • 抽象工厂模式与工厂方法模式的区别
    • 抽象工厂模式的适用场景
    • 工厂方法模式的示例
  • 小结

概述

这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
简单来说,使用了C++多态的特性,将存在继承关系的类,通过一个工厂类创建对应的子类(派生类)对象。在项目复杂的情况下,可以便于子类对象的创建。工厂
模式是我们比较常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。它是创建行模式。
工厂模式有三种:简单工厂模式、工厂方法模式和抽象工厂模式。


适用场景

  • 工厂模式的目的是为了实现解耦,将对象的创建和使用分开,即应用程序将对象的创建和初始化职责交给工厂对象。若一个对象A想要调用对象B时,如果直接通过new关键字来创建一个B实例,然后调用B实例,这样做的不好处是,当需求变更,要将B实例换成C实例时,则需要修改所有new了该实例的方法。
  • 降低代码重复。如果对象B的创建过程比较复杂,并且很多地方都用到了,那么很可能出现很多重复的代码,通过统一将创建对象B的代码放到工厂里面统一管理,可以减少代码的重复率,同时也方便维护。相比于构造函数来说,复杂的初始化,会使得构造函数非常的复杂。由于创建过程都由工厂统一的管理,有利于当业务发生变化之后的修改
  • 工厂模式将创建和使用分离,使用者不需要知道具体的创建过程,只需要使用即可。
  • 类本身有很多子类,并且经常性发生变化。
    创建对象需要大量重复的代码。
    创建对象需要访问某些信息,而这些信息不应该包含在复合类中。
    创建对象的生命周期必须集中管理,以保证在整个程序中具有一致的行为。

简单工厂模式(Simple Factory)

简单工厂模式简介

简单工厂模式 : 由 一个 工厂对象 决定 创建出 哪一种 产品类 的 实例 ;
简单工厂模式类型 : 创建型 ;

简单工厂模式的结构组成

  • 工厂类:工厂模式的核心类,会定义一个用于创建指定的具体实例对象的接口。
  • 抽象产品类:是具体产品类的继承的父类或实现的接口。
  • 具体产品类:工厂类所创建的对象就是此具体产品实例。

简单工厂模式的特点和优缺点

特点:

  • 它是一个具体的类,非接口 抽象类。有一个重要的create()方法,利用if或者 switch创建产品并返回。
  • create()方法通常是静态的,所以也称之为静态工厂。

优点:

  • 将对象的创建交给专门的工厂类负责,实现了对象的创建和对象的使用分离。
  • 提供专门的 工厂类 用于创建对象 , 客户端 无需知道所创建的产品类的类名 , 只需要知道对应产品类的参数即可创建对象实例.

缺点:

  • 工厂类职责过重,扩展性非常差,如果要增加新的产品 , 需要修改工厂类的判断逻辑,类型多时,不易维护 , 违背"开闭原则";.
  • 不支持不同的产品需要不同额外参数的情况。

简单工厂模式的适用场景

  • 创建对象少 : 工厂类 负责 创建的对象 比较少 ;
  • 不关心创建过程 : 客户端 只知道 传入 工厂类 的参数 , 对于 如何创建对象 不关心 ;

简单工厂模式的示例

功法工厂中有诸多功法、例如易筋经、神照经、小无相功、先天功等等。
每个功法各有特点,根据自身情况去选择合适自己的功法修行.

ISkill为功法的抽象类(基类),接口函数为Description(),用于描述功法特点.
YJJSkill 、SZJSkill 、XWXGSkill为具体功法的类,分别易筋经、神照经、小无相功,它们都继承于ISkill抽象类。
代码示例:

// 抽象产品类
class ISkill
{
public:virtual ~ISkill() {}virtual void Description() = 0;
};
/****************************************************************************************************/
//具体产品类
// 易筋经
class YJJSkill : public ISkill
{
public:void Description()//功法描述{std::cout << "达摩祖师所创,佛家至高绝学,练法古拙朴实,进无止境." << std::endl;}
};// 神照经
class SZJSkill : public ISkill
{
public:void  Description(){std::cout << "极其精纯的内功,习得大乘,全身内空完全充盈,有起死回生之效" << std::endl;}
};
// 小无相功
class XWXGSkill : public ISkill
{
public:void Description(){std::cout << "逍遥派的一门内功,威力强大,不着形相,无迹可寻,只要身具此功,可以模仿别人的绝学甚至胜于原版。" << std::endl;}
};
/****************************************************************************************************/
//工厂类
public class SimpleSkillFactory
{public:enum SKILL_TYPE{TYPE_YJ ,//易筋经TYPE_SZ ,//神照经TYPE_XW //小无相功};
public :static ISkill createSkill(int type){switch (type) {case TYPE_YJ :return new YJJSkill();case TYPE_SZ :return new SZJSkill();case TYPE_XW :return new XWXGSkill();default:return NULL;break;}}
}
/****************************************************************************************************/
//目前功法工厂就提供三种功法,这里,我选择修行易筋经来筑基.ISkill m_Skill = SimpleSkillFactory.createSkill(SimpleSkillFactory::TYPE_YJ);m_Skill.Description();

工厂方法模式

工厂方法模式简介

工厂方法模式 : 定义一个创建对象的接口,让实现这个接口的子类决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行 ;
工厂方法模式类型 : 创建型 ;


工厂方法模式的结构组成

  • 抽象工厂类:工厂方法模式的核心类,提供创建具体产品的接口,由具体工厂类实现。
  • 具体工厂类:继承于抽象工厂,实现创建对应具体产品对象的方式。
  • 抽象产品类:它是具体产品继承的父类(基类)。
  • 具体产品类:具体工厂所创建的对象,就是此类。

工厂方法模式的特点和优缺点

特点:

  • 工厂方法模式抽象出了工厂类,提供创建具体产品的接口,交由子类去实现;
  • 工厂方法模式的应用并不只是为了封装具体产品对象的创建,而是要把具体产品对象的创建放到具体工厂类实现。

优点:

  • 不关心创建细节 : 用户 只需要 关心 所需产品 对应的工厂 , 无需关心创建细节 ;
  • 符合开闭原则 : 加入 新产品 , 符合开闭原则 , 提高可扩展性 ;

缺点:

  • 增加复杂性 : 类的个数容易过多,增加系统复杂度 ;
    在添加新产品时,除了编写新的产品类之外,还要编写该产品类对应的 工厂类 ;
  • 增加难度 : 增加了系统 抽象性 和 理解难度 ;
    工厂方法本身 利用了抽象 , 该模式中会 引入抽象层 , 如果要动态创建产品类 , 还要 引入反射技术 ;
  • 一条生产线只能一个产品;

工厂方法模式的适用场景

  • 重复代码 : 创建对象 需要使用 大量重复的代码 ;
  • 不关心创建过程 : 客户端 不依赖 产品类 , 不关心 实例 如何被创建 , 实现等细节 ;
  • 创建对象 : 一个类 通过其 子类 来 指定 创建哪个对象 ;

工厂方法模式的示例

功法阁中有诸多功法、例如易筋经、神照经、小无相功、先天功等等。每个功法各有特点,根据自身的根骨去选择功法修行.
ISkillsFactory抽象工厂类,提供了创建具体功法的纯虚函数。
YJJFactorySZJFactoryXWXGFactory具体工厂类,继承持续功法类,实现对应具体功法对象的创建。


代码示例:

// 1.抽象工厂类
class ISkillsFactory
{
public:virtual  ISkill*CreateSkills() = 0;virtual ~ISkillsFactory() {}
};
/****************************************************************************************************/
//2.具体工厂类
// 易筋经完本
class YJJFactory: public ISkillsFactory{
public:ISkill *CreateSkills(){return new YJJSkill();}
};
/****************************************************************************************************/
//3.抽象产品,维持不变
/****************************************************************************************************/
//4.具体产品类
//神照经完本
class SZJFactory: public ISkillsFactory{
public:ISkill *CreateSkills(){return new SZJSkill();} };//小无相功完本
class XWXGFactory: public ISkillsFactory{
public:ISkill *CreateSkills(){return new XWXGSkill();} };
/****************************************************************************************************/
int main()
{// 藏经阁某一单间专门存储易筋经经文YJJFactory *YJJProducer = new YJJFactory ();// 从中取出一本易筋经YJJSkill *m_YJJSkill = YJJProducer ->CreateSkills();// 查看易筋经的描述m_YJJSkill ->Description();// 释放资源delete YJJProducer ;delete m_YJJSkill ;return 0;
}

抽象工厂模式

抽象工厂模式模式简介

抽象工厂模式 : 提供 一个 创建 一系列 相关 或 相互依赖 对象 的接口 ;
创建目标对象时 , 只需要直到对象的抽象类型或接口类型即可 , 不需要知道具体的实现类型 ;
抽象工厂模式类型 : 创建型 ;


抽象工厂模式 可以将 一组具有同一主题 , 单独的工厂 封装起来 ;
在使用时 , 客户端创建抽象工厂的实现 , 使用抽象工厂作为接口 , 来创建这一主题的对象 ;
使用的时候 , 不需要知道 从内部工厂方法中获得的对象的具体类型 ;
客户端只使用这些对象的 通用接口 ;
抽象工厂模式 实现了 一组对象的 实现细节 与 使用 分离 ;


抽象工厂模式的结构组成

  • 抽象工厂类:工厂方法模式的核心类,提供创建具体产品的接口,由具体工厂类实现。
  • 具体工厂类:继承于抽象工厂,实现创建对应具体产品对象的方式。
  • 抽象产品类:它是具体产品继承的父类(基类)。
  • 具体产品类:具体工厂所创建的对象,就是此类。

抽象工厂模式的特点和优缺点

特点:

  • 提供一个接口,可以创建多个产品族中的产品对象。
  • 使用抽象工厂模式 , 可以在工厂变化时 , 不需要修改 客户端 使用工厂的 代码 .

优点:

  • 隔离产品代码 : 在 应用层 隔离 具体产品的代码 , 客户端 无须关心 产品创建 的细节 ;
  • 创建产品族 : 将 一个系列 的 产品族 , 统一到一起创建 ;

缺点:

  • 扩展困难 : 规定了 所有 可能 被创建 的 产品集合 , 产品族 中 扩展 新的产品 困难 , 需要 修改抽象工厂的接口 ;
  • 增加难度 : 增加了系统的 抽象性 和 理解难度 , 还要 引入反射技术;

抽象工厂模式与工厂方法模式的区别

抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;
而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。
在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。.
如果工厂的产品全部属于同一个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式。


抽象工厂模式的适用场景

  • 忽略创建细节 : 客户端 不关心 产品实例 如何 被创建 , 实现等细节 ;
  • 创建产品族 : 强调 一系列 相关的 产品对象 , 一般是 同一个产品族 , 一起使用 创建对象需要大量重复的代码 ;
  • 产品类库 : 提供 一个 产品类 的库 , 所有的产品 以 同样的接口出现 , 使 客户端不依赖于具体实现 ;

当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。
假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。
工厂方法模式适用于产品种类结构单一的场合,为一类产品提供创建的接口;
而抽象工厂方法适用于产品种类结构多的场合,主要用于创建一组(有多个种类)相关的产品,为它们提供创建的接口;就是当具有多个抽象角色时,抽象工厂便可以派上用场。


工厂方法模式的示例

功法阁中有诸多功法、例如易筋经、神照经、小无相功、先天功等等。每个功法各有特点,根据自身的根骨去选择功法修行.
ISkill抽象产品类,提供了抽象产品类纯虚函数。
ISkillsFactory抽象工厂类,提供了创建具体功法的纯虚函数。
YJJFactorySZJFactoryXWXGFactory具体工厂类,继承持续功法类,实现对应具体功法对象的创建。


代码示例:

/****************************************************************************************************/
//1.抽象工厂类
//功法工厂
class ISkillsFactory
{
public:virtual  ISkill*CreateYJJSkills() = 0;virtual ~ISkillsFactory() {}
};
/****************************************************************************************************/
// 2.抽象产品类
class ISkill
{
public:virtual ~ISkill() {}virtual void Description() = 0; //功法描述virtual void Method() = 0;   //修行方法
};
/****************************************************************************************************/
//3.具体工厂类
// 易筋经存储室
class YJJFactory: public ISkillsFactory{
public:ISkill *CreateSkills(){return new YJJSkill();}
};//神照经存储室
class SZJFactory: public ISkillsFactory{
public:ISkill *CreateSkills(){return new SZJSkill();} };//小无相功存储室
class XWXGFactory: public ISkillsFactory{
public:ISkill *CreateSkills(){return new XWXGSkill();} };
/****************************************************************************************************/
//4.具体产品类
// 易筋经
class YJJSkill : public ISkill
{
public:void Description()//功法描述{std::cout << "达摩祖师所创,佛家至高绝学,练法古拙朴实,进无止境." << std::endl;} void Method()//修行方式{std::cout << "练好易筋经的关键是要学会调息。" << std::endl;}
};
/****************************************************************************************************/
int main()
{// 易筋经阁包含了大量的易筋经经文YJJFactory *YJJProducer = new YJJFactory ();// 从易筋经阁中取出一本易筋经YJJSkill *m_YJJSkill = YJJProducer ->CreateSkills();// 查看易筋经的描述m_YJJSkill ->Description();// 查看易筋经修行方式m_YJJSkill ->Method();// 释放资源delete YJJProducer ;delete m_YJJSkill ;return 0;
}

小结

为什么要使用工厂模式?

  • 统一创建对象的接口命名
  • 降低耦合度,结合多态,便于扩展,同时提高可阅读性。

面向对象的基本思想封装告诉我们,我们尽量将长的代码进行"切割",再将每一个小逻辑都"封装"起来,这样可以降低耦合度,修改的时候也可以直奔错误段落。

  • 封装创建对象时的初始化工作,使程序更规范有条理

如果使用C语言,分配并初始化的工作包括:
malloc申请内存(但申请完了对象并没有初始化,只是有了一片内存空间),并强制类型转换初始化这块内存,分配内存、类型转换、初始化等。
如果是C++,new的动作包括分配内存和调用构造函数两个步骤,比较简化了。这是对一般的初始化过程比较简单的对象。那如果初始化过程比较复杂呢?什么叫比较复杂的初始化过程呢?就是说创建对象不仅是分配内存空间,还要做一些其他初始化工作,甚至是与外部变量或者资源相关的工作。

设计模式之工厂模式(C++)相关推荐

  1. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  2. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  3. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  4. 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式

    设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...

  5. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  6. 设计模式之工厂模式(三)

    上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...

  7. php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式

    php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...

  8. 教你如何一篇博客读懂设计模式之—--工厂模式

    一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...

  9. 一篇博客读懂设计模式之---工厂模式

    设计模式之-工厂模式 工厂模式: 创建过程: 创建Shape接口 public interface Shape {void draw(); } 创建实现类: public class Circle i ...

  10. java 工厂模式详解_Java设计模式之工厂模式详解

    简单工厂其实并不是设计模式,只是一种编程习惯. 首先我们创建父类Cup,所有杯子类的父类.再创建它的子类BigCup和SmallCup类. public abstract class Cup { pu ...

最新文章

  1. MySQL的安装过程
  2. SparkSql读取外部数据源
  3. HDU - 3488 Tour(二分图最小权匹配+KM)
  4. Zookeeper 的 ZAB 协议
  5. Java Calendar getDisplayName()方法与示例
  6. java 网络序_JAVA 网络程序
  7. ScriptObject的坑人之处
  8. 40个前端新手入门练习项目,学完即可做项目
  9. springboot启动自动停止
  10. 存储器容量大小和芯片选择
  11. Ribbon界面开发(C++)
  12. linux中原子量的学习和理解
  13. 微信小程序云开发数据库update函数更新不了数据(已解决)
  14. PCB正片和负片的区别与使用
  15. 转 vo、po、dto、bo、pojo、entity、mode如何区分
  16. 麒麟座mini学习笔记之云端查看数据流
  17. 谁来PK“baidu局域网”
  18. 梆梆加固的病毒分析-破解篇
  19. anaconda3里pkgs可以删除吗,我试过conda clean -a,但用完之后还有10个G,吐血,C盘没空间了,pkgs删除影响虚拟环境吗,毕竟base大多数人用不到啊,求教
  20. 加速度传感器灵敏度表示的几种方式LSB/g,count/g,V/g,V/°,请给出几种方式之间的说明及转换公式

热门文章

  1. spring boot火车票预订系统毕业设计-附源码091029
  2. SpringBoot中@Pattern注解对时间格式校验
  3. 齐市青云小学三年级学计算机吗,齐齐哈尔市青云小学介绍
  4. coreldraw x7 分布_了解CorelDRAW X7工作界面
  5. 【深度强化学习】交叉熵方法
  6. arm linux游戏手柄(joystick)驱动移植
  7. 一个屌丝程序猿的人生(十七)
  8. 再看iOS如何使用SM2/SM3/SM4/SM9 方法二:使用http://gmssl.org这个开源密码箱来实现从编译到使用
  9. 淘宝【高佣卷】、【精品券】、【详情图片】
  10. 一种用于指导模拟 IC 布局的定制图神经网络模型