工厂模式:

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

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

简单工厂模式定义:定义一个工厂类,其可以根据参数的不同返回不同类的实例,被创建的实例通常具有共同的父类。由于在简单工厂模式中用于创建实例的方法是静态(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. 简单的字幕效果html,7种HTML5 Figure图片字幕标题特效
  2. MD5在线查询的实现
  3. 在游戏中强制关机,不能对关机提示框进行操作
  4. jQuery操作Select2控件
  5. 神策营销云:微信生态中,「电商」如何借“运营工具”,抢占 4.5 亿流量红利?...
  6. 通过防火墙堵住×××安全漏洞
  7. ES6-24 生成器与迭代器的应用
  8. 八、pink老师的学习笔记—— CSS用户界面样式(鼠标样式、轮廓线、防止拖拽文本域)
  9. 面向对象技术第一讲 多态性
  10. vs添加icon总是变为bitmap_欧赛尔vs勒阿弗尔
  11. RabbitMQ学习之集群模式
  12. 递归,复制对象,找质数,判断数组
  13. 【数据结构】二叉树的python实现
  14. 夜雨数竞笔记-极限(11)-欧拉常数
  15. methylKit:差异甲基化分析
  16. C++重学之路 1 计算机和C++简介
  17. 开源软件发展的保障:分发协议
  18. matlab 儒略历 函数,儒略日(儒略日 在线计算器)
  19. 如何强行卸载电脑上面的恶心软件
  20. 什么是网关?什么是路由?什么是IP?

热门文章

  1. SHELL编程之产生随机数
  2. FS5383A锂电池3.7V输入供电太阳能草坪灯驱动IC
  3. 【自动化】【微信公众号】油猴 - 自动发布文章
  4. linux中readline函数的用法,linux系统中readline的实现
  5. 共识(raft)算法
  6. dede文章内容页{dy}去掉拼音标题后面的ID的方法
  7. 51nod 1925 + 51nod 1095
  8. Ubuntu14.04 解决显卡切换风扇高速旋转显卡发烫
  9. 三人决斗_使用深度q决斗学习为厄运建立进攻性AI代理
  10. MQTT协议规范总结