您的位置:首页 > 其它

设计模式 简单工厂(simple factory pattern)

2012-03-26 18:00 836 查看
所有的创建模式都涉及到创建对象示例方式。这一点很重要,因为程序不应该依赖于对象如何创建和如何安排 。当然,使用new运算符是C#创建一个对象实力最简单的方法然而,这实际上相当于硬编码他和程序中如何创建对象管理有关。多数情况下,创建对象的本意随着程序的需求而不同,将创建一个抽象成一个专门的“创造器”类、,会使程序更加灵活、更通用工厂模式(Factory Method Pattern) 提供了一个简单的决策类,他根据提供的数据反回一个抽象基类的多个子类中的一个。
抽象工厂模式(Abstract Factory Pattern)提供了一个创建并返回一系列相关对象的接口。
单例模式(Singleton Pattern)是指某个类只能有一个实例。它提供一个访问该实例的全局访问点。
生成器模式(Builder Pattern)将一个复杂的对象的构建与他的表示分开,这样就能根据程序的需要创建不同的表现形式。
原型模式(Prototype Pattern)是先实例化一个类,然后拷贝或克隆该类来创建新的实例,可以用共有方法进一步修改这个实例

简单工厂
简单共产模式根据提供给他的数据,返回几个可能类中的一个实例,通常他返回的类都有一个共同的父类和共同的方法,但每个方法执行的任务不同,
而且根据不同的数据进行了优化,简单共产模式实际上不属于23GoF模式。

为了理解简单共产模式,我们来看下图。在该图中,X是一个基类,XY类和XZ类是他派生出来的、XFactory类根据给出的参数决定返回哪个一个子类 。
在右边定义了一个getClass方法,传递给他某个值如(abc),然后放回类X的某个实例,返回哪一个类的实例与程序员无关,
因为这些类有同样的方法,只是实现不同。返回那一个类的实力完全取决于工厂,工厂功能可能很复杂,但通常都很简单



下来我们看个例子
假设我们有一个窗体,窗体上边一个输入框只允许输入名字姓和名用","来分割是姓和名
首先构建一个基类
Namer

using System;

namespace NameFactory
{
/// <summary>
/// Summary description for Namer.
/// </summary>
//Base class for getting split names
public class Namer     {
//parts stored here
protected string frName, lName;

//return first name
public string getFrname(){
return frName;
}
//return last name
public string getLname() {
return lName;
}
}
}


派生两个子类,接下来编写两个简单的派生类,他们实现了接口,在构造函数中将名字分成两个部分。
在firstFirst类中。做了一个简单的假设:最后一耳光空格前面所有的部分都属于姓"firstname"

using System;

namespace NameFactory
{
/// <summary>
/// Summary description for FirstFirst.
/// </summary>
public class FirstFirst : Namer
{
public FirstFirst(string name)
{
int i = name.IndexOf (" ");
if(i > 0) {
frName = name.Substring (0, i).Trim ();
lName = name.Substring (i + 1).Trim ();
}
else {
lName = name;
frName = "";
}
}
}
}


在lastfirst、类中,用逗号给lastname划分界限。当空格逗号不存在是,两个类都提供了错误处理

using System;

namespace NameFactory
{
/// <summary>
/// Summary description for LastFirst.
/// </summary>
public class LastFirst : Namer
{
public LastFirst(string name)         {
int i = name.IndexOf (",");
if(i > 0) {
lName = name.Substring (0, i);
frName = name.Substring (i + 1).Trim ();
}
else {
lName = name;
frName = "";
}
}
}
}


工厂

using System;

namespace NameFactory
{
/// <summary>
/// Summary description for NameFactory.
/// </summary>
public class NameFactory     {
public NameFactory() {}

public Namer getName(string name) {
int i = name.IndexOf (",");
if(i > 0)
return new LastFirst (name);
else
return new FirstFirst (name);
}
}
}


使用工厂

Namer nm = nameFact.getName (txName.Text );
txFirst.Text = nm.getFrname ();
txLast.Text = nm.getLname ();





简单工厂具有同样方法类 的实例,他可以是不同派生子类的实例,也可以是实际上毫无关系仅仅是共享了相同接口的类。不管是哪种形式,这些类实例中的方法必须是相同的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: