1.什么是简单工厂

  现实中的工厂负责生产产品,顾名思义,编程中的简单工厂就是一个生产对象的类,它的主要作用是创建具体的产品类实例。我们以一个生产鼠标为例来分析简单工厂的作用,鼠标有两种:戴尔鼠标和惠普鼠标,代码如下:

    //鼠标抽象类
public abstract class Mouse
{
public abstract void Print();
} //戴尔鼠标
public class DellMouse : Mouse
{
public override void Print()
{
Console.WriteLine("生产了一个Dell鼠标!");
}
} //惠普鼠标
public class HpMouse : Mouse
{
public override void Print()
{
Console.WriteLine("生产了一个惠普鼠标!");
}
}

客户端代码:

    class Program
{
static void Main(string[] args)
{
Mouse mouse1 = new DellMouse();
Mouse mouse2 = new DellMouse();
Mouse mouse3 = new DellMouse();
Mouse mouse4 = new DellMouse();
Mouse mouse5 = new DellMouse();
mouse1.Print();
}
}

程序运行如下:

  我们可以看到程序运行没有问题,通过new一个DellMouse我们可以创建一个戴尔的鼠标,这时有一个问题,如果我们不想要戴尔鼠标了,要全部生产惠普鼠标怎么办呢?最简单直接的方法就是把 new DellMouse全部替换成 new HpMouse 。如果我们的软件中new了100个DellMouse实例呢?一个一个地去替换会是一个巨大的工作量,同时通过new的方式来创建戴尔鼠标的实例,会让DellMouse类和客户端产生强耦合关系,这时候使用简单工厂就可以帮助我们降低耦合,减少工作量了。添加一个MouseFactory简单工厂类,这个工厂类专门来创建Mouse的实例:

   /// <summary>
/// 鼠标工厂类
/// </summary>
public class MouseFactory
{
private Mouse mouse = null;
public Mouse CreateMouse(string brand)
{
switch (brand)
{
case "dell":
mouse = new DellMouse();
break;
case "hp":
mouse = new HpMouse();
break;
default:
break;
}
return mouse;
}
}

客户端的代码就可以改成:

    class Program
{
static void Main(string[] args)
{
//实例化一个工厂类
MouseFactory mouseFactory = new MouseFactory();
//通过工厂类创建鼠标
Mouse mouse1 = mouseFactory.CreateMouse("dell");
Mouse mouse2 = mouseFactory.CreateMouse("dell");
Mouse mouse3 = mouseFactory.CreateMouse("dell");
Mouse mouse4 = mouseFactory.CreateMouse("dell");
Mouse mouse5 = mouseFactory.CreateMouse("dell");
mouse1.Print();
Console.ReadKey();
}
}

  运行程序结果一样的,这样做有什么好处呢?我们看到我们把以前的 new DellMouse() 替换成了  mouseFactory.Create("dell") ,客户端和DellMouse的耦合变成了 客户端<-->MouseFactory<-->DellMouse形式,有效降低了客户端和DellMouse间的耦合。我们还用一个疑问,程序改成这样的话,如果我们想把戴尔鼠标全部换成惠普鼠标,要把工厂类的参数"dell"换成"hp",不是还要改100次?任务量没有降低呀!对于这个问题,我们可以把品牌名brand存放在一个地方,如配置文件中,这样我们想切换鼠标品牌时就不用修改代码,直接修改配置文件即可,如下:

配置文件:

  <appSettings>
<add key="dbname" value="dell"/>
</appSettings>

工厂类修改为:

    /// <summary>
/// 鼠标工厂类
/// </summary>
public class MouseFactory
{
//从配置文件中读取品牌
private static readonly string brand = ConfigurationManager.AppSettings["brand"];
private Mouse mouse = null;
public Mouse CreateMouse()
{
switch (brand)
{
case "dell":
mouse = new DellMouse();
break;
case "hp":
mouse = new HpMouse();
break;
default:
break;
}
return mouse;
}
}

客户端代码就不用传参数了,如下:

    class Program
{
static void Main(string[] args)
{
//实例化一个工厂类
MouseFactory mouseFactory = new MouseFactory();
//通过工厂类创建鼠标
Mouse mouse1 = mouseFactory.CreateMouse();
Mouse mouse2 = mouseFactory.CreateMouse();
Mouse mouse3 = mouseFactory.CreateMouse();
Mouse mouse4 = mouseFactory.CreateMouse();
Mouse mouse5 = mouseFactory.CreateMouse();
mouse1.Print();
Console.ReadKey();
}
}

现在我们想把生产的鼠标都换成惠普鼠标,只需要将配置文件中的dell改成hp即可,修改配置文件后运行结果如下:

大功告成!这时有一个问题,如果我们想生产华硕鼠标怎么办呢?除了添加一个继承Mouse的AsusMouse类外,还要在MouseFactory中添加一段case 代码。按照开闭原则,添加一个实现类没什么问题,开闭原则中对添加开放;但是修改MouseFactory工厂类就违背了对修改闭合的原则了。后边的工厂模式就是专门用来解决这个问题的。

2.小结

上边例子的类图:

简单工厂的优点:

  1.简单工厂可以有效地降低客户端和具体对象的耦合,将new具体对象的任务交给了一个简单工厂类

  2可以有效的进行代码复用,如客户端A和客户端B都需要一个具体对象,客户端A和客户端B可以通过同一个简单工厂来获取具体类型的实例

简单工厂的缺点:

  一定程度上违背了开闭原则,在新增产品时需要修改简单工厂类

C#设计模式(1)——简单工厂模式的更多相关文章

  1. C#设计模式(2)-简单工厂模式

    引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...

  2. C#设计模式(2)——简单工厂模式(转)

    C#设计模式(2)——简单工厂模式   一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理 ...

  3. Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)

    jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...

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

    原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2579100.html 今天呢,要学习的设计模式是“简单工厂模式”,这是一个 ...

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

    iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/ ...

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

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

  7. php实现设计模式之 简单工厂模式

    作为对象的创建模式,用工厂方法代替new操作. 简单工厂模式是属于创建型模式,又叫做静态工厂方法模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 工厂 ...

  8. [python实现设计模式]-3.简单工厂模式-触宝开放平台

    预备知识: 开放封闭原则(Open-Closed Principle OCP) Software entities(classes,modules,functions etc) should open ...

  9. C++实现设计模式之 — 简单工厂模式

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4251756.html 所谓简单工厂模式,是一种实例化对象的方式,只要输入需要实例化对象的名字 ...

  10. C#设计模式之简单工厂模式

    简单工厂模式解释:  简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一 ...

随机推荐

  1. Matplotlib学习---用matplotlib和sklearn画拟合线(line of best fit)

    在机器学习中,经常要用scikit-learn里面的线性回归模型来对数据进行拟合,进而找到数据的规律,从而达到预测的目的.用图像展示数据及其拟合线可以非常直观地看出拟合线与数据的匹配程度,同时也可用于 ...

  2. 【Gym - 100796C 】Minimax Tree

    BUPT2017 wintertraining(15) #7FMinimax Tree 题意 给你一棵多叉树,非叶子节点中分配k个为子节点的min函数,剩下的是max函数. 现在求根节点(1)的最大值 ...

  3. 【转】Qt之JSON保存与读取

    简述 许多游戏提供保存功能,使得玩家在游戏中的进度可以被保存,并在以后再玩的时候进行加载.保存游戏的过程通常涉及将每个游戏对象的成员变量序列化为文件.要实现这个功能,可以采取许多格式,其中之一就是 J ...

  4. NOIp 2018 游记

    Day0 啥都没做,记了一下 vimrc 和配置,然后搞了一下午的颓. 然后头有点晕乎乎的,早点洗澡去睡觉,在床上想了很多,但还是强制自己大脑放空,早点睡着了. Day1 由于去年的教训,今年我决定先 ...

  5. python 获取当前文件夹下所有文件名

    os 模块下有两个函数: os.walk() os.listdir() 1 # -*- coding: utf-8 -*- 2 3 import os 4 5 def file_name(file_d ...

  6. VCC、VDD和VSS

    在电子电路中,常可以看到VCC.VDD和VSS三种不同的符号,它们有什么区别呢? 一.解释 VCC:C=circuit 表示电路的意思, 即接入电路的电压:  VDD:D=device 表示器件的意思 ...

  7. centos7下mysql半同步复制原理安装测试详解

    原理简介: 在MySQL5.5之前,MySQL的复制其实都是异步复制(见下图),主库和从库的数据之间存在一定的延迟,这样存在一个隐患:当在主库上写入一个事务并提交成功,而从库尚未得到主库推送的BinL ...

  8. js jquery 判断元素是否在数组内

    js jquery 判断元素是否在数组内 一,js方法 var arr = ["a", "b", "c"]; // js arr.index ...

  9. Manjaro下带供电的USB Hub提示error -71

    问题描述 这款USB Hub是绿联出的1转7带供电的白色款. 在lsusb中显示为 Bus 004 Device 023: ID 05e3:0616 Genesys Logic, Inc. hub B ...

  10. tyvj/joyoi 1305 最大子序和

    带了一个转化的单调队列裸题. 转化为前缀和相减即可. 有一点需要注意:从0开始入队而不是1,因为要统计第一个. (从网上找的对拍程序,结果别人写错了) /** freopen("in.in& ...