博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之工厂模式
阅读量:4690 次
发布时间:2019-06-09

本文共 3792 字,大约阅读时间需要 12 分钟。

一、简介

  工厂模式属于创建型模式,大致上可以分三类:
  1)、简单工厂模式(Simple Factory)
  2)、工厂方法模式(Simple Factory)
  3)、抽象工厂模式(Simple Factory)
  这三种模式是逐步抽象,并且更具一般性。另有一种分法就是将简单工厂模式看作是工厂方法的一种特例,归为一类模式。如下是使用工厂模式的情况:
  1.在编码时不能预见需要创建哪种类的实例
  2.系统不应依赖于产品类实例如何被创建、组合和表达的细节,对于使用者来说是透明的

二、目标

  目标:提高内聚(Cohesion)和松耦合(Coupling)
  最重要的功能:
  1)、定义创建对象的接口,封装了对象的创建;
  2)、使得具体化类的工作延迟到了子类中
三、实现

简单工厂

enum CTYPE {PRODUCT_A, {PRODUCT_B};   class Product  {  public:      virtual void Display() = 0;};    class ProductA: public Product{  public:      void Display() { cout<<"Display A"<

工厂方法

enum CTYPE {PRODUCT_A, {PRODUCT_B};   class Product  {  public:      virtual void Display() = 0;};    class ProductA: public Product{  public:      void Display() { cout<<"Display A"<

抽象工厂

enum CTYPE {PRODUCT_A, {PRODUCT_B};   class Product  {  public:      virtual void Display() = 0;};    class ProductA: public Product{  public:      void Display() { cout<<"Display A"<

如下是本人用模板实现的通用的性工厂模式:(推荐大家采用本实现)

#ifndef CRREATEFACTORY_H#define CRREATEFACTORY_H#include #include 
template
class ConcreteCreator{public: static Product* CreateConcreteProduct() { return new ConcreteProduct(); }};template
class CreatorFactory{public: static CreatorFactory& Instance() { static CreatorFactory
instance; return instance; }public: typedef Product* (*CreateProductDelegate)(); typedef std::map
MapFactories; template
void RegisterFactory(const std::string& factoryName) { m_factories[factoryName] = ConcreteCreator
::CreateConcreteProduct; } void UnregisterFactory(const std::string& factoryName) { if(m_factories.size() > 0) { MapFactories::iterator it = m_factories.find(factoryName); if(it != m_factories.end()) { m_factories.erase(it); } } } void UnregisterFactories() { m_factories.clear(); } Product* CreateProduct(const std::string& factoryName) { MapFactories::iterator type = m_factories.find(factoryName); if (type != m_factories.end()) { CreateProductDelegate create = type->second; if (create != 0) return create(); } return 0; } void ReleaseProduct(Product** product) { if(*product) { Product* p = *product; *product = 0; delete p; p = 0; } }private: CreatorFactory() {} ~CreatorFactory() {} CreatorFactory(const CreatorFactory&); CreatorFactory& operator=(const CreatorFactory&);private: MapFactories m_factories;};#endif//CRREATEFACTORY_H#include
#include
#include
#include
#include "CreatorFactory.h"using namespace std;class CBase{public:};class Person : public CBase{public:};class Age : public CBase{public:};class Gender : public CBase{public:};#include
#include
#include
class Base{public: Base() { strcpy(name,"Base"); } virtual void display() { cout<<"Display Base."<
display(); printf("Process name = %s\n", typeid(*type).name()); } else if( (typeid(Child2)) == (typeid(*type)) ) { ((Child2*)type)->display(); printf("Process name = %s\n", typeid(*type).name()); } else { cout<<"Unknow type!"<
::max)(); int min = (numeric_limits
::min)(); typedef CreatorFactory
PersonFactory; PersonFactory& factory = PersonFactory::Instance(); factory.RegisterFactory
("Person"); factory.RegisterFactory
("Age"); factory.RegisterFactory
("Gender"); CBase* person = factory.CreateProduct("Person"); CBase* age = factory.CreateProduct("Age"); CBase* gender = factory.CreateProduct("Gender"); factory.UnregisterFactory("Age"); factory.ReleaseProduct(&age); factory.UnregisterFactory("Henry"); Base *pT1 = new Child1(); Base *pT2 = new Child2(); Process(pT1); Process(pT2); pT1->printName(); pT2->printName(); printf("OK/n"); getchar(); return 0;} 如果本工厂方法用gcc编译应该会有错误提示,那是因为gcc的要求非常严格:error: expected ';' before it.这时就需要在MapFactoried::iterator 前面加typename. 就可以修正这个bug。请参看《C++ Primer》中的“模板与泛型编程”

转载于:https://www.cnblogs.com/wenrenhua08/p/3933631.html

你可能感兴趣的文章
进程与线程的一个简单解释【摘】
查看>>
COJ976 WZJ的数据结构(负二十四)
查看>>
slid.es – 创建在线幻灯片和演示文稿的最佳途径
查看>>
2016年6月份那些最实用的 jQuery 插件专辑
查看>>
如何在数据库中使用索引
查看>>
ring0
查看>>
windows虚拟机下 安装docker 踩过的坑
查看>>
使用 CXF 做 webservice 简单例子
查看>>
2017-2018-1 20155339 《信息安全系统设计基础》第8周学习总结
查看>>
socket.io 消息发送
查看>>
C# 两个datatable中的数据快速比较返回交集或差集
查看>>
关于oracle样例数据库emp、dept、salgrade的mysql脚本复杂查询分析
查看>>
一些有趣的代码
查看>>
从RTP到ORTP
查看>>
单文档切换OpenGL视图
查看>>
抽象类和接口的区别
查看>>
JS生成随机的字母数字组合的字符串
查看>>
[jQuery] form提交到iframe之后,获取iframe里面内容
查看>>
js new到底干了什么,new的意义是什么?
查看>>
python基础3
查看>>