工厂模式:

工厂模式是常用的一类创建型设计模式,通常工厂模式是指工厂方法模式。其是使用频率最高的工厂模式。

上图几种工厂模式由简到难;

简单工厂模式定义:定义一个工厂类,其可以根据参数的不同返回不同类的实例,被创建的实例通常具有共同的父类。由于在简单工厂模式中用于创建实例的方法是静态(static)方法,因此又被称为静态工厂方法模式。

简单工厂的要要点在于,只需要传一个正确的参数,就可以获取所需对象。其结构简单,核心在于

工厂类的设计。

简单工厂模式角色:

Factory(工厂角色):即工厂类,是简单工厂模式的核心;工厂类可直接被外界函数调用,创建所需的产品对象;工厂类中提供了静态的工厂方法factoryMethod(),其返回类型为抽象产品类型Product。

Product(抽象产品角色): 是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法,提高了整个系统的灵活性。使得在工厂类中只需要定义一个通用的工厂方法,因为创建的具体产品对象都是其子类的对象。

ConcreteProduct(具体产品角色):是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每个具体产品都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。

Product(抽象产品角色):

class shape  //形状类
{
public:virtual void show() = 0;
};

ConcreteProduct(具体产品角色):

class Square : public shape //正方形类
{
public:void show() { cout << "this is square" << endl; }
};class Rectangle : public shape //长方形类
{
public:void show() { cout << "this is rectangle" << endl; }
};

Factory(工厂角色):

class factory //这就是工厂
{
public:factory() {};~factory() {};shape* create(int x, int y) //创建逻辑{if (x == y)return new Square;elsereturn new Rectangle;}
};

简单工厂总代码:

class shape  //形状类
{
public:virtual void show() = 0;
};class Square : public shape //正方形类
{
public:void show() { cout << "this is square" << endl; }
};class Rectangle : public shape //长方形类
{
public:void show() { cout << "this is rectangle" << endl; }
};class factory //这就是工厂
{
public:factory() {};~factory() {};shape* create(int x, int y) //创建逻辑{if (x == y)return new Square;elsereturn new Rectangle;}
};

工厂方法模式:

简单工厂模式虽然简单,但当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品类,此时必定要修改工厂类的源代码。违背“开闭原则”。此时为了不影响增加新产品而不影响已有代码?工厂方法模式应运而生。

工厂方法角色:

抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。

具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。

抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。

具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

工厂方法和简单工厂的区别:

工厂方法:一个对象的构建由工厂的子类型(具体的工厂)对应。而简单工厂中,是由工厂的一个静态方法负责;

Product(抽象产品角色):

//写一个日志记录(工厂方法)--->抽象对象,具体对象,抽象工厂,具体工厂
//日志记录器接口:抽象产品
struct Logger
{Logger() { cout << "日志记录器接口Logger" << endl; }virtual ~Logger() { cout << "~Logger" << endl; }virtual void writelog() = 0;
};

ConcreteProduct(具体产品角色):

// 数据库日志记录器:具体产品
class DatabaseLogger : public Logger
{
public:DatabaseLogger() { cout << "DatabaseLogger" << endl; }~DatabaseLogger() { cout << "~DatabaseLogger" << endl; }void writelog(){cout << "数据库日志记录。" << endl;}
};// 文件日志记录器:具体产品
class FileLogger : public Logger
{
public:FileLogger() { cout << "FileLogger" << endl; }~FileLogger() { cout << "~FileLogger" << endl; }void writelog(){cout << "文件日志记录。" << endl;}
};

AbstractFactory(抽象工厂角色):

// 日志记录器工厂接口:抽象工厂
struct LoggerFactory
{virtual my_unique_ptr<Logger> createLogger() = 0;LoggerFactory() { cout << "LoggerFactory" << endl; }virtual ~LoggerFactory() { cout << "~LoggerFactory" << endl; }
};

ConcreteProduct(具体产品):

// 数据库日志记录器工厂类 : 具体工厂
class DatabaseLoggerFactory : public LoggerFactory
{
public:DatabaseLoggerFactory() { cout << "DatabaseLoggerFactory" << endl; }~DatabaseLoggerFactory() { cout << "~DatabaseLoggerFactory" << endl; }my_unique_ptr<Logger> createLogger(){return my_unique_ptr<Logger>(new DatabaseLogger());// return my_make_unique<DatabaseLogger>();}
};// 文件日志记录器工厂类 : 具体工厂
class FileLoggerFactory : public LoggerFactory
{
public:FileLoggerFactory() { cout << "FileLoggerFactory" << endl; }~FileLoggerFactory() { cout << "~FileLoggerFactory" << endl; }my_unique_ptr<Logger> createLogger(){return my_unique_ptr<Logger>(new FileLogger());}
};

工厂方法模式完整代码:(其中my_unique_ptr 可以参考智能指针unique_ptr)

//写一个日志记录(工厂方法)--->抽象对象,具体对象,抽象工厂,具体工厂
//日志记录器接口:抽象产品
struct Logger
{Logger() { cout << "日志记录器接口Logger" << endl; }virtual ~Logger() { cout << "~Logger" << endl; }virtual void writelog() = 0;
};// 数据库日志记录器:具体产品
class DatabaseLogger : public Logger
{
public:DatabaseLogger() { cout << "DatabaseLogger" << endl; }~DatabaseLogger() { cout << "~DatabaseLogger" << endl; }void writelog(){cout << "数据库日志记录。" << endl;}
};// 文件日志记录器:具体产品
class FileLogger : public Logger
{
public:FileLogger() { cout << "FileLogger" << endl; }~FileLogger() { cout << "~FileLogger" << endl; }void writelog(){cout << "文件日志记录。" << endl;}
};// 日志记录器工厂接口:抽象工厂
struct LoggerFactory
{virtual my_unique_ptr<Logger> createLogger() = 0;LoggerFactory() { cout << "LoggerFactory" << endl; }virtual ~LoggerFactory() { cout << "~LoggerFactory" << endl; }
};// 数据库日志记录器工厂类 : 具体工厂
class DatabaseLoggerFactory : public LoggerFactory
{
public:DatabaseLoggerFactory() { cout << "DatabaseLoggerFactory" << endl; }~DatabaseLoggerFactory() { cout << "~DatabaseLoggerFactory" << endl; }my_unique_ptr<Logger> createLogger(){return my_unique_ptr<Logger>(new DatabaseLogger());// return my_make_unique<DatabaseLogger>();}
};// 文件日志记录器工厂类 : 具体工厂
class FileLoggerFactory : public LoggerFactory
{
public:FileLoggerFactory() { cout << "FileLoggerFactory" << endl; }~FileLoggerFactory() { cout << "~FileLoggerFactory" << endl; }my_unique_ptr<Logger> createLogger(){return my_unique_ptr<Logger>(new FileLogger());}
};int main()
{my_unique_ptr<LoggerFactory> factory(new FileLoggerFactory());my_unique_ptr<Logger> logger = factory->createLogger();//具体工厂创建具体日志logger->writelog();factory.reset(new DatabaseLoggerFactory());logger = factory->createLogger();logger->writelog();return 0;}

简单工厂和工厂方法模式(附简单实例)相关推荐

  1. 设计模式---3(工厂方法模式的概念,工厂方法模式的实现,工厂方法模式和简单工厂模式比较)

    工厂方法模式 概念 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 . 工厂方法模式的意义 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责产品的创建,这样核 ...

  2. 工厂方法模式和简单工厂模式的区别

    简单工厂模式 就我们的计算器例子来说,简单工厂模式的思想就是,创建一个运算类,创建一个简单工厂类. 运算类派生加法类.减法类.乘法类...... 简单工厂类主要是根据传入的符号字符串,做相应的条件判断 ...

  3. 工厂方法模式、简单工厂模式、抽象工程模式

    1.概述 工厂设计模式是一种创建型模式,它提供了一种创建对象的最佳方式.在工厂模式中,我们创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象. 1.1. 针对的问题 在 ...

  4. 工厂方法模式VS简单工厂模式

    转发请注明出处:http://blog.csdn.net/qq_28055429/article/details/51628921 One----简单工厂模式: 一,基本知识: (1)定义:简单工厂模 ...

  5. 工厂方法模式完成简单KFC点餐

    同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能: 1.正常餐品结算 ...

  6. android mvp简单的例子,Android MVP 模式的简单实现

    一.概述 MVP(Model-View-Presenter) 是总所周知MVC模式的一个演变,他们的主要目的都是划分模块职责,降低模块耦合,易测试,提高代码复用,网上有很多相关的知识,这里仅是个人看法 ...

  7. 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细

    1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...

  8. 简单工厂模式与工厂方法模式

    在OO设计领域,我们知道前人总结了不少的经验,许多的经验在现代软件工程过程中已经被认为是原则来遵守.下面笔者摘抄几项下文涉及到的OO原则的定义. OCP(开闭原则,Open-Closed Princi ...

  9. 最简单java设计模式:工厂方法模式

    前言 在前一篇文章讲解了一下简单工厂模式,在上篇文章中,我们也讲到了简单工厂模式的缺点,就是不满足开闭原则,这对于软件的设计来说,是不太好的,而下面讲解的工厂方法模式,正是为了弥补简单工厂模式的缺点, ...

最新文章

  1. Netty整合SpringMVC,实现高效的HTTP服务请求
  2. 解决VS2012 Express的There was a problem sending the command to the program问题
  3. ETL异构数据源Datax_部署前置环境_01
  4. python连接redis失败、积极拒绝_python-django-redis拒绝连接问题解决_20191121
  5. cocos2dx 3.10 网狐土豪金版PC+手机端棋牌平台搭建
  6. Mac otool替代readelf命令
  7. 如何在iPhone、iPad和Mac上查看照片的EXIF数据?
  8. 洛谷 P1040 加分二叉树
  9. 关于ListCtrol自绘的技巧
  10. 实战撤回对方QQ消息+防止别人撤回消息插件演示附软件
  11. java字符常量_java字符常量
  12. 正确区分LJMP、AJMP、SJMP、JMP指令()
  13. JavaScript 全栈工程师培训教程 - 阮一峰
  14. 虚拟机超线程性能分析深入浅出
  15. java list下标_Java list删除指定多个下标数据
  16. 什么是单页网站设计?受欢迎的原因在哪?
  17. git基础教程(11) git checkout命令,掌握这些足以
  18. 服务器没有立即响应请求,服务器没有及时响应或控制请求
  19. 工程伦理2019春季学堂学分课(慕课平台)(含期末考试答案)
  20. 从宝丽来到数字电影——图像与视频色彩的科学

热门文章

  1. 金蝶系统客户端服务器,金蝶客户端服务器地址是什么
  2. matlab 线性回归 参数显著性,如何用MATLAB最小二乘法得出回归方程系数?
  3. IIS设置——大杂烩
  4. vs2019怎么样建立头文件_VS2019编译运行 C/C++ 详细教程——同时美化你的 IDE
  5. git checkout简介
  6. iphone开发软件Xcode3.2.6破解免证书真机开发调试方案
  7. 【Qt】模型-视图-代理(Model-View-Delegate)
  8. nmf算法 python_NMF、CNMF(原理+python实现)
  9. 如何在面试中找到优秀的程序员(转载)
  10. 华为eNSP下防火墙双机热备的实现以及在HRP配置错误时的现象