简单工厂和工厂方法模式(附简单实例)
工厂模式:
工厂模式是常用的一类创建型设计模式,通常工厂模式是指工厂方法模式。其是使用频率最高的工厂模式。
上图几种工厂模式由简到难;
简单工厂模式定义:定义一个工厂类,其可以根据参数的不同返回不同类的实例,被创建的实例通常具有共同的父类。由于在简单工厂模式中用于创建实例的方法是静态(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;}
简单工厂和工厂方法模式(附简单实例)相关推荐
- 设计模式---3(工厂方法模式的概念,工厂方法模式的实现,工厂方法模式和简单工厂模式比较)
工厂方法模式 概念 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 . 工厂方法模式的意义 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责产品的创建,这样核 ...
- 工厂方法模式和简单工厂模式的区别
简单工厂模式 就我们的计算器例子来说,简单工厂模式的思想就是,创建一个运算类,创建一个简单工厂类. 运算类派生加法类.减法类.乘法类...... 简单工厂类主要是根据传入的符号字符串,做相应的条件判断 ...
- 工厂方法模式、简单工厂模式、抽象工程模式
1.概述 工厂设计模式是一种创建型模式,它提供了一种创建对象的最佳方式.在工厂模式中,我们创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象. 1.1. 针对的问题 在 ...
- 工厂方法模式VS简单工厂模式
转发请注明出处:http://blog.csdn.net/qq_28055429/article/details/51628921 One----简单工厂模式: 一,基本知识: (1)定义:简单工厂模 ...
- 工厂方法模式完成简单KFC点餐
同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能: 1.正常餐品结算 ...
- android mvp简单的例子,Android MVP 模式的简单实现
一.概述 MVP(Model-View-Presenter) 是总所周知MVC模式的一个演变,他们的主要目的都是划分模块职责,降低模块耦合,易测试,提高代码复用,网上有很多相关的知识,这里仅是个人看法 ...
- 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细
1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...
- 简单工厂模式与工厂方法模式
在OO设计领域,我们知道前人总结了不少的经验,许多的经验在现代软件工程过程中已经被认为是原则来遵守.下面笔者摘抄几项下文涉及到的OO原则的定义. OCP(开闭原则,Open-Closed Princi ...
- 最简单java设计模式:工厂方法模式
前言 在前一篇文章讲解了一下简单工厂模式,在上篇文章中,我们也讲到了简单工厂模式的缺点,就是不满足开闭原则,这对于软件的设计来说,是不太好的,而下面讲解的工厂方法模式,正是为了弥补简单工厂模式的缺点, ...
最新文章
- 简单的字幕效果html,7种HTML5 Figure图片字幕标题特效
- MD5在线查询的实现
- 在游戏中强制关机,不能对关机提示框进行操作
- jQuery操作Select2控件
- 神策营销云:微信生态中,「电商」如何借“运营工具”,抢占 4.5 亿流量红利?...
- 通过防火墙堵住×××安全漏洞
- ES6-24 生成器与迭代器的应用
- 八、pink老师的学习笔记—— CSS用户界面样式(鼠标样式、轮廓线、防止拖拽文本域)
- 面向对象技术第一讲 多态性
- vs添加icon总是变为bitmap_欧赛尔vs勒阿弗尔
- RabbitMQ学习之集群模式
- 递归,复制对象,找质数,判断数组
- 【数据结构】二叉树的python实现
- 夜雨数竞笔记-极限(11)-欧拉常数
- methylKit:差异甲基化分析
- C++重学之路 1 计算机和C++简介
- 开源软件发展的保障:分发协议
- matlab 儒略历 函数,儒略日(儒略日 在线计算器)
- 如何强行卸载电脑上面的恶心软件
- 什么是网关?什么是路由?什么是IP?