body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

常见设计模式的解析和实现(C++)之一-Factory 模式 

作用:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类

抽象基类:
1) Product:创建出来的对象的抽象基类.
2) Factory 创建对象的工厂方法的抽象基类.
接口函数:
1) Creator::FactoryMethod:纯虚函数,由派生类实现,创建出对应的 Product.
解析:
在这个模式中,有两个抽象基类,一个是 Product 为创建出来的对象的抽象基类,一个是 Factory 是工厂的抽象基类,在互相协作的时候都是由相应的 Factory 派生类来生成Product的派生类,也就是说如果要新增一种Product那么也要对应的新增一个 Factory,创建的过程委托给了这个 Factory.也就是说一个 Factory和一个 Product 是一一对应的关系.
备注:
设计模式的演示图上把Factory类命名为Creator,下面的实现沿用了这个命名.
#ifndef __FACTORY_H__
#define __FACTORY_H__
#include<iostream>
using namespace std;
class product
{
        public:
                product(){  cout<<"product()"<<endl;  }
                virtual ~product(){  cout<<"~product()"<<endl;  }
};
class A
{
        public:
                A(){  cout<<"A()"<<endl;  }
                ~A(){  cout<<"~A()"<<endl;  }
};
class B
{
        public:
                B(){  cout<<"B()"<<endl;  }
                ~B(){  cout<<"~B()"<<endl;  }
};
class concreteproduct:public product
{
        public:
                concreteproduct(A* pa,B* pb):_pa(pa),_pb(pb)
                {
                        cout<<"concreteproduct()"<<endl; 
                }
                ~concreteproduct(){  cout<<"~concreteproduct()"<<endl;  }
        private:
                A* _pa;
                B* _pb;
};
class factory
{
        public:
                factory(){  cout<<"factory()"<<endl;  }
                // 抽象类
                virtual product* create() = 0;
                virtual ~factory(){  cout<<"~factory()"<<endl;  }
};
class concretefactory:public factory
{
        public:
                concretefactory(){  cout<<"concretefactory()"<<endl;  }
                product* create();
                ~concretefactory(){  cout<<"~concretefactory()"<<endl;  }
};
product* concretefactory::create()
{
        cout<<"concretefactory::create()"<<endl;
        A* pa = new A();
        B* pb = new B();
        product* pro = new concreteproduct(pa,pb);
        return pro;
}
endif
#include<iostream>
#include"factory.h"
using namespace std;
int main()
{ // 工厂模式主要用来创建复杂对象
  // 一个产品对应一个工厂类
        factory* fac = new concretefactory();
        product* pro = fac->create();
        delete fac;
        delete pro;
        return 0;
}

 

Factory,工厂设计模式,C++描述的更多相关文章

  1. PHP高级特性-反射Reflection以及Factory工厂设计模式的结合使用[代码实例]

    PHP高级特性-反射以及工厂设计模式的结合使用 [结合 Laravel-Admin 代码实例讲解] 利用反射来实现工厂模式的生产而无需创建特定的工厂类 本文地址http://janrs.com/?p= ...

  2. Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...

  3. 工厂设计模式 Factory

    Factory 主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类. 例如:汽车销售商场 该模式将创建对象的过程放在了一个静态方法中来实现.在实际编程中,如果需要大量的创建对象,该模 ...

  4. 设计模式之Factory工厂模式

    在上一章,模板模式中,我们在父类规定处理的流程,在子类中实现具体的处理.如果我们将该模式用于生成实例,便演变成了Factory模式,即工厂模式. 在Factory模式中,父类决定实例的生成方式,但并不 ...

  5. Java工厂设计模式

    程序在接口和子类之间加入一个过渡类,通过此过渡类端取得接口的实例化对象,一般都会称这个过渡端为工厂类 //=============================================== ...

  6. dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程

    *1 dom4j解析器   1)CRUD的含义:CreateReadUpdateDelete增删查改   2)XML解析器有二类,分别是DOM和SAX(simple Api for xml).     ...

  7. 使用C# (.NET Core) 实现抽象工厂设计模式 (Abstract Pattern)

    本文的概念性内容来自深入浅出设计模式一书. 上一篇文章讲了简单工厂和工厂方法设计模式 http://www.cnblogs.com/cgzl/p/8760250.html, 使用的是披萨店的例子. 文 ...

  8. php设计模式之工厂设计模式

    概念:        工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤. 很多高级模式都是依赖于工厂模式. 好处:         PHP中能够创建基于变量内容 ...

  9. java简单工厂设计模式

    一.基本定义 /* *简单工厂设计模式: *文字描述理解: * 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式. * 通过专门定义一个类来负责创建其它类的实例,被创建的实例通常 * 都具有共同 ...

  10. Java设计模式—工厂设计模式

    工厂设计模式(减少耦合.通过接口或者工厂类来实现) 耦合性:粘度强(依耐性) Person p = new Person();  //耦合性强              Man p = new Per ...

随机推荐

  1. js正则表达式的积累

    验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9][0-9]*)$ 验证 ...

  2. Asp.net core 学习笔记 ( Router 路由 )

    和之前的一样用法. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory log ...

  3. Axure RP 8 下载 激活可以使用的授权码、用户名、秘钥等

    百度云下载地址: 链接:https://pan.baidu.com/s/13z0IPsKbLdPktiCD5eUe-A 提取码: oxhw 用户名: axureuser 序列号: 8wFfIX7a8h ...

  4. 数据结构(C语言版)-第4章 串、数组和广义表

    补充:C语言中常用的串运算 调用标准库函数 #include<string.h> 串比较,strcmp(char s1,char s2) 串复制,strcpy(char to,char f ...

  5. English trip EM2-LP-1B Favorite Things Teacher:William Full name: Willian Richard Ogzrd 威廉理查德·奥格兹德

    课上内容(Lesson) # music pop  流行音乐 light music 轻音乐 rep 说唱音乐 rack 摇滚乐 classic  古典乐 hip-hop n. 街舞,即兴音乐:嘻哈 ...

  6. Vue音乐项目笔记(五)

    1.搜索列表的点击删除.删除全部的交互事件 https://blog.csdn.net/weixin_40814356/article/details/80496097 seach组件中放search ...

  7. python基础之函数名的使用,闭包以及迭代器

    内容梗概: 1. 函数名的使⽤用以及第⼀一类对象 2. 闭包 3. 迭代器 1.函数名一. 函数名的运⽤.函数名是一个变量, 但它是⼀个特殊的变量, 与括号配合可以执行函数的变量.1.1 函数名的内存 ...

  8. 【JS】【3】标签显示几秒后自动隐藏

    $("#XXX").show().delay(2000).hide(0); 2000,0:可选,速度,(毫秒:"slow":"fast") ...

  9. Android之Activity生命周期详解

    Activity的生命周期方法: onCreate()--->onStart()--->onResume()--->onPause()--->onStop()--->on ...

  10. 把url链接转换成二维码的工具类

    import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io ...