设计模式实现C++ --工厂模式

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

类型:创建型模式

分类:

  简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类。有点抽象,举个例子就明白了。有一家生产处理器核的厂家,它只有一个工厂,能够生产两种类型的产品。客户需要什么样的产品,一定要显示地告诉生产工厂。下面给出一种实现方案:

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4
 5 class product
 6 {
 7 public:
 8         virtual void show(){}
 9 };
10
11 class productA:public product
12 {
13 public:
14         virtual void show()
15         {
16                 cout << "product A" << endl;
17         }
18 };
19
20 class productB:public product
21 {
22 public:
23         virtual void show()
24         {
25                 cout << "product B" << endl;
26         }
27 };
28
29 class Factory
30 {
31 public:
32         static product* CreateProduct(string pro)
33         {
34                 if(pro == "A")
35                         return new productA();
36                 else if(pro == "B")
37                         return new productB();
38                 return NULL;
39         }
40 }

  这样设计的主要缺点之前也提到过,就是要增加新的核类型时,就需要修改工厂类。这就违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。于是,工厂方法模式出现了。

  工厂方法模式,是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。举个例子,有两个工厂,工厂A只生产PROUCUTA, 工厂B只生产PRODUCTB,现在客户需要做的就是找到对应的工厂,而不需要告诉工厂我需要做什么型号的产品,实现方案如下:

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4
 5 class product
 6 {
 7 public:
 8         virtual void show(){}
 9 };
10
11 class productA:public product
12 {
13 public:
14         virtual void show()
15         {
16                 cout << "product A" << endl;
17         }
18 };
19
20 class productB:public product
21 {
22 public:
23         virtual void show()
24         {
25                 cout << "product B" << endl;
26         }
27 };
28
29 class Factory
30 {
31 public:
32         virtual product* CreateProduct() = 0;
33 };
34
35 class FactoryA:public Factory
36 {
37 public:
38         product* CreateProduct() { return new productA();}
39 };
40
41 class FactoryB:public Factory
42 {
43 public:
44          product* CreateProduct() {return new productB();}
45 };
46
47                                                                   

  工厂方法模式的缺点就是每增加一种产品,就要增加一个工厂, 如果这个公司迅速发展,新增了很多产品,那么就要开设很多相应的工厂。在C++实现中,就是要定义一个个的工厂类。显然,相比简单工厂模式,工厂方法模式需要更多的类定义。

  抽象工厂模式, 它的定义为提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的的类,具体应用,有两个农场,一个家场专门生产北方水果和蔬菜,一个农声只生产热带水果和蔬菜,下面给出实现的代码。

 1 #include <iostream>
 2 using namespace std;
 3
 4 class Fruit
 5 {
 6 public:
 7         virtual void show() = 0;
 8 };
 9
10 class Veggie
11 {
12 public:
13         virtual void show() = 0;
14 };
15
16 class NorthernFruit:public Fruit
17 {
18 public:
19         void show()
20         {
21                 cout << "NortherFruit" << endl;
22         }
23 };
24
25 class TropicalFruit:public Fruit
26 {
27 public:
28         void show()
29         {
30                 cout << "TropicalFruit" << endl;
31         }
32 };
33
34 class NorthernVeggie:public Veggie
35 {
36 public:
37         void show()
38         {
39         }
40 };
41
42 class Gardener
43 {
44 public:
45         virtual Fruit* createFruit() = 0;
46         virtual Veggie* createVeggie() = 0;
47 };
48
49 class NorthernGardener:public Gardener
50 {
51 public:
52         Fruit* createFruit()
53         {
54                 return new NorthernFruit();
55         }
56
57         Veggie* createVeggie()
58         {
59                 return new NorthernVeggie();
60         }
61 };
62
63
64 class TropicalGardener:public Gardener
65 {
66 public:
67         Fruit* createFruit()
68         {
69                 return new TropicalFruit();
70         }        Veggie* createVeggie()
71         {
72                 return new TropicalVeggie();
73         }
74 };
75
76
77                                                                                                                              

优点:

  • 可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。
  • 对调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。
  • 降低耦合度。产品类的实例化通常来说是很复杂的,它需要依赖很多的类,而这些类对于调用者来说根本无需知道,如果使用了工厂方法,我们需要做的仅仅是实例化好产品类,然后交给调用者使用。对调用者来说,产品所依赖的类都是透明的。

适用场景:

不管是简单工厂模式,工厂方法模式还是抽象工厂模式,他们具有类似的特性,所以他们的适用场景也是类似的。

首先,作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过new就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

其次,工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品需要增加依赖关系时,可以考虑使用工厂模式。将会大大降低对象之间的耦合度。

再次,由于工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完成,扩展性比较好。也就是说,当需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装。

设计模式实现C++ --工厂模式

时间: 2024-08-25 01:05:02

设计模式实现C++ --工厂模式的相关文章

【设计模式】简单工厂模式

以面向对象的思想和简单工厂模式,写一个C++计算器程序,代码如下: #include <iostream> using namespace std; class Operation { public: Operation(double left, double right) { lhs = left; rhs = right; } const double GetLeft() const { return lhs; } const double GetRight() const { retur

设计模式之简单工厂模式

设计模式之简单工厂模式 动机:         不暴露实例化逻辑来创建对象.通过公共的接口创建新的对象.         这是一个简单的实现,客户端需要一个product,但是client不直接使用new对象,而是通过提供需要的对象信息来找factory得到新的product.         这个factory实例化一个具体的product并返回(转化成抽象的类),client段使用这个抽象的类而不用考虑它具体的实现. 应用举例:        也许工厂模式是使用最多的模式之一.举个例子,一个

设计模式之抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 最大的好处便是易于交换产品系列,由于具体工厂类,在一个应用中只需在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体工厂即可使用不同的产品配置. 他使具体创建实例的过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离. 下面的代码还使用了反射与XML. 代码如下: using System; using System.Collections.Ge

设计模式之抽象工厂模式20170803

创建型设计模式之抽象工厂模式: 一.含义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类. 具体来说, 为一组具有相同约束(属性)的对象,提供一个接口,这个接口下有不同的实现,每个实现类对应一种类型的约束(一种具体的属性),同时提供该类型的约束(属性)下所有对象的创建方法 二.代码说明 1.主要有两个角色 1)一组互相影响的产品线(对象),也叫做产品族 2)抽象工厂类及其实现类 抽象工厂类:在N个产品族中,在抽象工厂类中就应该有N个创建方法 实现类:具体实现类是产品族的具体

设计模式初探—简单工厂模式

为什么要学习设计模式? 可重用.可维护.可扩展.灵活性好 什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 简单工厂模式的好处? (1)将具体业务和实现进行分离 (2)将多个具体业务之间进行解耦 解决的问题? 单独的类来创造

设计模式 2/23 工厂模式(二)

先要给各位同学灌输一个思想,世间本无设计模式,用的人多了,自然就有了 没有太明显的优劣之分,只道是谁更适合 如果没法理解<<工厂>>,建议阅读上一篇 设计模式 2/23 工厂模式(一) ,毕竟是一个渐进明细的过程,急不来的 这一篇分享 工厂模式 回想一下简单工厂,我们把具体类的实例化工作放在一个工厂方法里面来执行. 同时故意在上一篇提到了开放-封闭原则. 仔细想象看看上一篇的代码,到底有没有遵守这个原则,或者说这个原则有没有被严格意义的遵守,或者说遵守的程度是多少. 如果我们要新增

【幻化万千戏红尘】qianfengDay10-java基础学习:成员内部类、静态内部类、局部和匿名内部类,设计模式之简单工厂模式

课程回顾: 接口:1.属性:public\static\final2.方法:public\abstract 多态:1.静态化(编译时)多态重载2.动态化(运行时)多态重写对象转型 1.向上转型 2.向下转型 今日内容:内部类:定义在类的内部的类1.成员内部类格式:[修饰符] class 类名 { }内部不能有静态的属性和方法,可以访问外部类的属性,也可以调用外部类的方法 在静态方法中的使用格式:外部类 外对象=new 外部类();成员内部类 对象名=外对象.new 成员内部类(); 2.静态内部

JS设计模式(动态工厂模式)

<!--引入的核心JS文件--> <script type="text/javascript" src="CommonUtil.js"></script> <script type=text/javascript charset=utf-8> <!--JS设计模式(细粒度工厂模式)--> //搭建一个工厂环境 买什么车——(去什么店)卖车的店——卖车——生产车 //卖车店 super Shop 只有卖车的方

iOS设计模式 - (3)简单工厂模式

iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/details/40381721 一.简述 简单工厂模式(FACTORY),通过面向对象的封装,继承和多态来降低程序的耦合度.将一个具体类的实例化交给一个静态工厂方法来执行. 该模式中的角色包括: 工厂类(Simple Factory): 只包含了创建具体类的静态方法. 抽象产品(Product):

大话设计模式_简单工厂模式(Java代码)

简单的描述:一个父类.多个子类,实例化那个子类由一个单独的工厂类来进行 图片摘自大话设计模式: 运算类: 1 package com.longsheng.simpleFactory; 2 3 public class Calculate { 4 5 private double firstNum; 6 private double secondNum; 7 8 public double getFirstNum() { 9 return firstNum; 10 } 11 12 public v