严格意义上来说,简单工厂模式并不属于GoF的23种设计模式,但是它是学习其他工厂模式的基础和前提条件。理解了简单工厂模式,学习工厂方法模式和抽象工厂模式会比较容易一些。

简单工厂模式的定义

定义一个工厂类,他可以根据不同的参数返回不同类的实例。通常情况下,被创建的类的实例通常都具有共同的父类。

简单工厂模式又可以称之为静态工厂方法模式,因为创建对象实例的方法通常都是静态方法。

在简单工厂模式中,只需要记住一点。一个简单的参数可以即可获得所需的对象实例。

简单工厂模式的UML图如下:

简单工厂模式包含三个角色:

 1、工厂角色(Factory)该类是简单工厂的核心,我们所需要的对象实例就是这个类帮我们创建的,它里面有一个静态方法GetProduct(string productType),我们通过传入产品类型(productType)来得到我们想要的产品。

2、抽象产品角色(AbstractProduct):该类是所有产品的父类。它可以是接口或者抽象类。只有这样我们才能给工厂的GetProduct(string productType)方法定义返回值。

3、实体产品(ConcreteProductA,ConcreteProductB,ConcreteProductC):这些类是简单工厂最终要创建的目标,也是客户端最终想要的对象实例。

现在来假设一种场景,我们开发过程中,肯定会用到按钮,圆形按钮、正方形按钮、矩形按钮等等,在程序的很多地方我们都可能会复用这些按钮。我们可以通过一个简单工厂来帮助我们创建这些按钮。

首先我们要声明工厂要生产的产品(各种按钮)类

    public class Button
{
public virtual void OnClick()
{ }
}
public class RoungButton:Button
{
public override void OnClick()
{
Console.WriteLine("点击了圆形按钮!");
}
}
public class SquareButton:Button
{
public override void OnClick()
{
Console.WriteLine("点击了正方形按钮!");
}
}
public class RectangleButton:Button
{
public override void OnClick()
{
Console.WriteLine("点击了矩形按钮!");
}
}

其次是我们的(静态工厂类)

public class ButtonFactory
{
public static Button CreateButton(string type)
{
Button btnObj = null;
switch (type)
{
case "round":
btnObj = new RoungButton();
break;
case "square":
btnObj = new SquareButton();
break;
case "rect":
btnObj = new RectangleButton();
break;
}
return btnObj;
}
}

在此处还有一些要说明的要点。

简单工厂类帮助我们创建的是一类产品,这一类产品有一个共同的父类,这个父类是作为工厂方法的返回值来使用的。如果没有这个共同的父类,我们的程序就需要用object作为返回值,然后在程序中进行强制转换,这个明显是非常不友好的编程。而作为一名程序员,在程序中进行大量的装箱和拆箱操作是比较耗费性能的,良好的编程习惯中,也应该尽量减少装箱拆箱的操作。

然后我们就可以在控制台调试我们的程序了

        static void Main(string[] args)//文件名的修改
{
Button roundBtn = ButtonFactory.CreateButton("round");
roundBtn.OnClick();
Button squareBtn = ButtonFactory.CreateButton("square");
squareBtn.OnClick();
}

程序的运行结果如下图:

最后给大家介绍一个和技术相关的付费问答平台、阅读平台-技易  欢迎访问:http://www.seekwd.com

欢迎关注官方微信号:

设计模式之简单工厂模式(C#语言描述)的更多相关文章

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

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

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

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

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

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

  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. [python实现设计模式]-3.简单工厂模式-触宝开放平台

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

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

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

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

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

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

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

随机推荐

  1. centos6.5 的rpm 可以来这边找

    http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-i386/gcc-4.8.2-16.3.fc20/

  2. linux 批量替换所有文件中包含的字符串

    sed -i "s/原来字符串/新字符串/g" `grep 原来字符串 -rl .` 格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 ...

  3. 洛谷——P2958 [USACO09OCT]木瓜的丛林Papaya Jungle

    P2958 [USACO09OCT]木瓜的丛林Papaya Jungle 题目描述 Bessie has wandered off the farm into the adjoining farmer ...

  4. hihocoder1062 最近公共祖先·一

    #1062 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在 ...

  5. bzoj4543[POI2014]Hotel

    题目链接 bzoj4543 [POI2014]Hotel 题解 这不是裸地点分嘛 ,我真傻,真的 n^2 这不是是sb题,~滑稽 ~ 枚举点转换为无根树,暴力子树中点的深度 计数转移 令a b c d ...

  6. java源码阅读Object

    1 类注释 Class {@code Object} is the root of the class hierarchy. Every class has {@code Object} as a s ...

  7. Scala零基础教学【41-60】

    第41讲:List继承体系实现内幕和方法操作源码揭秘 def main(args: Array[String]) { /** * List继承体系实现内幕和方法操作源码揭秘 * * List本身是一个 ...

  8. catalina_home与catalina_base

    CATALINA_HOME是Tomcat的安装目 录,CATALINA_BASE是Tomcat的工作目录. 如果我们想要运行Tomcat的多个实例,但是不想安装多个Tomcat软件副本.那么我们可以配 ...

  9. 在sublime执行自定义脚本

    [背景] 一般项目都会有一个预处理的脚本, 在发布,或者预览效果的时候,往往要先执行脚本. 想法来自editplus 习惯了editplus的同学,都知道,可以配置自定义执行的脚本. 一般我会把它配置 ...

  10. eth0: ERROR while getting interface flags: No such device

    出现这个问题有两种原因: 虚拟机设置中没有添加对应的网卡 更改了虚拟机中网卡的MAC,但是Debian 的缓存中将eth0与上次的MAC对应 解决方法: 这里仅就第二种问题提出解决方案: 删除/etc ...