设计模式之简单工厂模式(Simple Factory)

时间:2023-02-07 10:04:14

原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2579100.html

今天呢,要学习的设计模式是“简单工厂模式”,这是一个实现起来比较简单的设计模式,但是确是经常使用的设计模式,同时呢,使用简单工厂模式好处也是比较多的。可以说学习了这个模式性价比还是比较高的。

1.宏观理解简单工厂模式

  想来想去,还是觉得这个例子比较好:现在要完成一个计算器的功能,要求输入两个数A,B和一个运算符号(+,-,*,%),能够输出运算结果。注意哦,我们这里说的是面向对象的编程,别总想面向过程的思路。既然是面向对象,那首先我们想想要有哪些类吧!先想一想,可不可以这样有一个类Operator里面包含add,sub,mult,div四个方法,然后再包含两个成员变量A和B呢?通过这个类是可以完成目前的要求,可以要是从软件工程的角度,需求变化在软件开发过程中是无法避免的,那么现在又要完成取余(%)操作呢?这是要修改Operator类了吧,这就违背面向对象设计模式的OCP原则了。这显然不是一个好的设计。实际上这是一个典型的利用“简单工厂模式”的例子,那看看利用简单工厂模式怎么做吧。首先声明一个Operator类,类中包含operation方法,然后声明四个类Add,Sub,Sub,Mult四个类继承Operator类,四个子类中重写operation方法,分别完成加,减,乘,除操作。现在要说工厂了,工厂实际上也是一个类Factory,类中包括一个Operator类型成变量和CreateOperator()方法,该类用于创建各种Operator实例,可以根据传递的参数动态创建Add,Sub,Sub,Mult各种实例。这时如果要增加取余(%)操作,只需要建一个取余操作的子类,然后再工厂类中增加一点点创建的代码就KO了。这样的话,客户端只需要实例化一个工厂类就可以创建各种Operator对象了。想想都思路清晰,怎一个“爽”子字了得。具这样做都要什么好处呢??等等再说,还是先看看实现的代码是什么样的吧!!!

2.代码实现简单工厂模式

  看看上面的例子代码实现是什么样的吧,代码写的好,往往更好理解设计模式具体是怎么回事!!(代码总只实现一部分子类)

设计模式之简单工厂模式(Simple Factory)
 1 class Operator
2 {
3 private:
4 double A;
5 double B;
6 public:
7 double operation();
8 }
9 //加法子类
10 class Add : public Operator
11 {
12 double operation()
13 {
14 return A + B;
15 }
16 }
17 //减法子类
18 class Sub : public Operator
19 {
20 double operation()
21 {
22 return A - B;
23 }
24 }
25 //工厂类
26 class OperatorFactory
27 {
28 private:
29 Operator op;
30 Operator CreateOperator(string OperationType)
31 {
32 switch(OperationType)
33 {
34 case "+":
35 op = new Add();
36 break;
37 case "-":
38 op = new Sub();
39 break;
       ………………
42 }
43 }
44 }
设计模式之简单工厂模式(Simple Factory)

  准备工作做完了,那么在客户端那边怎么使用这些类呢?

1 Operator op;
2 op = OperatorFactory.CreateOperator("+");
3 op.A = 23;
4 op.B = 20;
5 cout<<op.Operation()<<endl;

3.简单工厂模式的好处

  看出来这样做有什么好处了吗?先看看木有工厂类是什么样的吧。这时,在客户端只要是使用四种子类,就要实例化子类,不断的实例化,并且客户端也要花费大量的代码决定具体实例化的哪个子类。这时如果子类的实例化方式要是改变,那么要改动的地方就多了去了。使用了简单工厂模式,在客户端我们只需要调用OperatorFactory实例就可以很方便的使用这些类了,减轻了客户端的压力,同时使得系统的可扩展性,也更易于复用了。这也正式很多设计模式要达到的目的。

  不妨看看网友是怎么说的:

  网摘1:

  面向对象的设计的目的之一,就是把责任进行划分,以分派给不同的对象。我们推荐这种划分责任的作法, 是因为它和封装(Encapsulation)和分派(Delegation)的精神是相符合的。创建性模式把对象的创立过程封装起来,使得创立实例的责任与使用实例的责任分割开, 并由专门的模块分管实例的创建,而系统在宏观上不再依赖于对象创立过程的细节。

  网摘2:

  举个更实际例子,比如你写了个应用,里面用到了数据库的封装,你的应用可以今后需要在不同的数据库环境下运行,可能是oracle,db2,sql server等,那么连接数据库的代码是不一样的,你用传统的方法,就不得不进行代码修改来适应不同的环境,非常麻烦,但是如果你采用工厂类的话,将各种可能的数据库连接全部实现在工厂类里面,通过你配置文件的修改来达到连接的是不同的数据库,那么你今后做迁移的时候代码就不用进行修改了。

(注:实际上简单工厂模式也是有缺陷的,并不是完全符合OCP原则,这里不多少了,学习工厂方法模式的时候对比着来吧,这样可能效果更好!!)

设计模式之简单工厂模式(Simple Factory)的更多相关文章

  1. 设计模式之简单工厂模式Simple Factory(四创建型)

    工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory ...

  2. 【设计模式】简单工厂模式 Simple Factory Pattern

    简单工厂模式Simple Factory Pattern[Simple Factory Pattern]是设计模式里最简单的一个模式,又叫静态工厂模式[Static Factory Pattern], ...

  3. C&num;设计模式-1简单工厂模式Simple Factory)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 简单的工 ...

  4. 设计模式之简单工厂模式&lpar;Simple Factory Pattern&rpar;

    一.简单工厂模式的由来 所有设计模式都是为解决某类问题而产生的,那么简单工厂模式是为解决什么问题呢?我们假设有以下业务场景: 在一个学生选课系统中,文科生用户选课时,我们要获得文科生的所有课程列表:理 ...

  5. 设计模式之—简单工厂模式&lt&semi;Simple Factory Pattern &gt&semi;

    简单工厂模式结构图: 简单工厂模式以简单的加减乘除运算为例: 运算符类(Operation): namespace CalcTest.Simple_Factory_patterns { class O ...

  6. 【UE4 设计模式】简单工厂模式 Simple Factory Pattern

    概述 描述 又称为静态工厂方法 一般使用静态方法,根据参数的不同创建不同类的实例 套路 创建抽象产品类 : 创建具体产品类,继承抽象产品类: 创建工厂类,通过静态方法根据传入不同参数从而创建不同具体产 ...

  7. Golang设计模式—简单工厂模式&lpar;Simple Factory Pattern&rpar;

    Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...

  8. 创建型模式(前引)简单工厂模式Simple Factory

    一引出的原因(解决下面的问题) 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式. 在简单工厂模式 ...

  9. 大白话简单工厂模式 &lpar;Simple Factory Pattern&rpar;

    大白话简单工厂模式 (Simple Factory Pattern) 从买车经历说起 毕业两年,码农张小两口无法忍受挤公交,凌晨起床抢火车票的痛苦,遂计划买车.逛了多家4S店,最终定下日产某车型的轿车 ...

  10. Net设计模式实例之简单工厂模式&lpar;Simple Factory Pattern&rpar;

    一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...

随机推荐

  1. Java的序列化ID的作用

    Java的序列化ID的作用 简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersio ...

  2. FLEX SharedObject介绍及应用

    ShareObject介绍: 1 ShareObject,顾名思义共享对象,而通常意义上的共享,从B/S结构上来讲,无非是客户端(浏览器端)的共享和服务器端的共享了,不错,ShareObject刚好份 ...

  3. C&num;泛型List的用法

    C#泛型List的用法 来源:C#学习    发布时间:2014/1/4 一.List<T>命名空间: System.Collections.Generic(程序集:mscorlib) 二 ...

  4. NSIntger CGFloat NSNumber

    NSIntger  CGFloat  NSNumber 1.NSIntger  (long) %ld NSInteger a=; NSLog(@"----------%ld",(l ...

  5. wpa&lowbar;supplicant 中的wpa&lowbar;supplicant&period;conf

    主要记录下wep加密相关的配置文件的写法. network={ ssid="static-wep-test2" key_mgmt=NONE wep_key0= //密钥索引为2, ...

  6. TCP&sol;IP协议原理与应用笔记23:路由选择模块 和 路由表的设计

    1. 路由选择模块 和 路由表的设计 2. 路由选择算法(路由模块在路由表中查找算法) (1)用IP分组中的目的IP地址查找路由表,使用匹配表项的下一跳地址完成分组交付 (2)匹配条件: dIP &a ...

  7. Oracle数据库作业-5 查询

    14.查询所有学生的Sname.Cno和Degree列. select t.sname,c.cno,c.degree from student t inner join score c on t.sn ...

  8. Quick Cocos2dx 与 EnterFrame事件

    利用EnterFrame做出行走的效果,效果图如下: 具体操作: 1 给self多加一个bg1用作与bg无限循环换位 2 在AnotherScene:onEnter方法里面新增onEnterFrame ...

  9. c&plus;&plus;选择重载函数

    一.函数重载 普通函数重载的关键是参数列表---也称函数特征标.函数参数中有以下情况可以出现重载: 1.  形参个数不同 2.  形参的类型不同 3.  形参的类型和个数都不同 const形参和函数重 ...

  10. MFC 的SetWindowPos 用法

    转自于:http://hi.baidu.com/max_new/blog/item/e2bbe607b1f127c57b8947c0.html 许多软件,特别是占桌面面积不是很大的软件,通常都提供了一 ...