设计模式之简单工厂模式(C#语言描述)
严格意义上来说,简单工厂模式并不属于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#语言描述)的更多相关文章
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...
- C#设计模式(2)-简单工厂模式
引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...
- C#设计模式(2)——简单工厂模式(转)
C#设计模式(2)——简单工厂模式 一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理 ...
- 设计模式之简单工厂模式(Simple Factory)
原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2579100.html 今天呢,要学习的设计模式是“简单工厂模式”,这是一个 ...
- iOS设计模式 - (3)简单工厂模式
iOS设计模式 - (3)简单工厂模式 by Colin丶 转载请注明出处: http://blog.csdn.net/hitwhylz/article/ ...
- [python实现设计模式]-3.简单工厂模式-触宝开放平台
预备知识: 开放封闭原则(Open-Closed Principle OCP) Software entities(classes,modules,functions etc) should open ...
- 设计模式之简单工厂模式Simple Factory(四创建型)
工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory ...
- C#设计模式之简单工厂模式
简单工厂模式解释: 简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一 ...
- php实现设计模式之 简单工厂模式
作为对象的创建模式,用工厂方法代替new操作. 简单工厂模式是属于创建型模式,又叫做静态工厂方法模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 工厂 ...
随机推荐
- [xampp] ubuntu终端连接xampp的mysql
/opt/lampp/bin/mysql -u root
- [Jquery]斑马线表格
<!doctype html> <html> <head> <script src='js/jquery-1.9.1.min.js'></scri ...
- 火柴棒等式c++
先建立一个sum数组,打表存入1—9每个数字需要的火柴棒数,然后手动二重循环0—1000的所有数字,写一个int型函数用来计算每个数字需要多少根火柴棒(当前数字%10后在sum数组的下标),然后,最后 ...
- [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)
题意:树上单点修改,询问链上k大值. 思路: 1.DFS序+树状数组套主席树 首先按照套路,关于k大值的问题,肯定要上主席树,每个点维护一棵权值线段树记录它到根的信息. 关于询问,就是Que(u)+Q ...
- [BZOJ 1805] Sail 船帆
Link: BZOJ 1805 传送门 Solution: 一道思路比较巧的线段树的题目 首先可以发现,答案和顺序是没有关系的,都是$\sum_{i=1}^n {H_i∗(H_i−1)/2}$. 那么 ...
- 【kmp算法】poj2185 Milking Grid
先对每行求出所有可能的循环节长度(不需要整除). 然后取在所有行中都出现了的,且最小的长度为宽. 然后将每一行看作字符,对所有行求next数组,将n-next[n](对这些行来说最小的循环节长度)作为 ...
- new beginning
新的一年开始. BLOG搬到CNBLOG. 往事太匆匆, 一切终成风. 他日再相逢, 依旧笑语中. -----AT.Y
- IO流--字符流缓冲技术
缓冲技术是为了提高数据的读写效率而提出的. (1)字符流的缓冲读 在字符流的缓冲技术中提供了一个newLine()方法,这个方法是跨平台的 在读数据的时候采用读完直接刷新的方式可以保证断电后数据不会丢 ...
- iOS应用程序多语言本地化
多语言在应用程序中一般有两种做法:一.程序中提供给用户自己选择的机会:二.根据当前用户当前移动设备的语言自动将我们的app切换对应语言. 第一种做法比较简单完全靠自己的发挥了,这里主要讲第二种做法,主 ...
- Swift,初始化
1.class中的值是没办法不赋值,不然会报错,那么就有个init的方法初始化(这个方法使得实例时必须加上参数) class test{ var a:String var b:Int init(a:S ...