简单工厂模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单工厂模式相关的知识,希望对你有一定的参考价值。

 

今天很幸运----------简单工厂模式之一  ------------设计模式

 

 

简单工厂模式根据提供的数据或者参数返回几个可能的类中的一个实例,说通俗点有点像面向对象编程中的多态性,一个基类,有多个派生类,在另外的调用程序中,根据参数来决定返回这个基类的哪个具体的派生类,返回值为基类类型,因为基类的引用可以指向派生类对象,而且这些所有的派生类都包含有基类的函数,也就是说派生类中有相同的函数,但是函数的实现可能不同。

在简单工厂模式中,通常其返回的所有的类都有一个共同的基类和一些共同的方法,不过每一个类都完成不同的功能,并针对不同的数据类型做了不同的优化。简单工厂模式实际上并不是23个常用设计模式之一,但是也算是设计模式的简单入门,对以后的学习有比较大的帮助。

 

简单的理解,简单工厂模式更多的使用了面向对象编程中的多态性,基类的引用可以指向派生类,并且调用派生的方法,即多态性。

 

假定X是一个基类,XY和XZ都是派生于X的派生类,XFactory类中根据提供给它的参数来决定返回XY或者 类的哪一个,返回的是哪个类的实例对于编程者来说并不是那么重要,因为这些类有着相同的方法,编程者需要做的就是通过基类引用直接调用方法,不用去关心到底返回的是哪个派生类,因为这些类有相同的方法,只是实现不同而已。如何决定返回哪一个派生类,取决于工厂的设计,该方法可以是非常复杂的函数,也可以是简单的函数。

 假设我们有一个类,用来存放名字,其中包含名字的姓和名分别存放。这个类的基本代码如下:

using System;  
02.  
03.namespace NameFactory  
04.{  
05.    /// <summary>  
06.    /// Summary description for FirstFirst.  
07.    /// </summary>  
08.    public class FirstFirst : Namer  
09.    {  
10.        public FirstFirst(string name)  
11.        {  
12.            int i = name.IndexOf (" ");  
13.            if(i > 0) {  
14.                frName = name.Substring (0, i).Trim ();  
15.                lName = name.Substring (i + 1).Trim ();  
16.            }  
17.            else {  
18.                lName = name;  
19.                frName = "";  
20.            }  
21.        }  
22.    }  
23.}  
技术分享
技术分享
using System;  
02.  
03.namespace NameFactory  
04.{  
05.    /// <summary>  
06.    /// Summary description for LastFirst.  
07.    /// </summary>  
08.    public class LastFirst : Namer  
09.    {  
10.        public LastFirst(string name)       {  
11.            int i = name.IndexOf (",");  
12.            if(i > 0) {  
13.                lName = name.Substring (0, i);  
14.                frName = name.Substring (i + 1).Trim ();  
15.            }  
16.            else {  
17.                lName = name;  
18.                frName = "";  
19.            }  
20.        }  
21.    }  
22.}  
技术分享

两个派生类中构造函数根据是不是有“,”来将名字中的姓和名分割开来,分别保存的对应的变量中。

然后我们就可以构建简单的工厂了,只需要检测逗号的存在,然后返回两个类中的一个就可以了。

技术分享
using System;  
02.  
03.namespace NameFactory  
04.{  
05.    /// <summary>  
06.    /// Summary description for NameFactory.  
07.    /// </summary>  
08.    public class NameFactory    {  
09.        public NameFactory() {}  
10.  
11.        public Namer getName(string name) {  
12.            int i = name.IndexOf (",");  
13.            if(i > 0)  
14.                return new LastFirst (name);  
15.            else  
16.                return new FirstFirst (name);  
17.        }  
18.    }  
19.}  
 

以上是关于简单工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式学习——简单工厂模式工厂模式抽象工厂模式

PHP面向对象之选择工厂和更新工厂

设计模式-简单工厂工厂方法模式抽象工厂模式详解

设计模式之简单工厂模式

C++工厂模式(简单工厂工厂方法抽象工厂)

C++工厂模式(简单工厂工厂方法抽象工厂)