所有的创建模式都涉及到创建对象示例方式。这一点很重要,因为程序不应该依赖于对象如何创建和如何安排 。当然,使用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;
2
3 namespace NameFactory
4 {
5 /// <summary>
6 ///
Summary description for Namer.
7 /// </summary>
8 //Base
class for getting split names
9 public class Namer {
10 //parts
stored here
11 protected string frName, lName;
12
13 //return
first name
14 public string getFrname(){
15 return frName;
16 }
17 //return
last name
18 public string getLname() {
19 return lName;
20 }
21 }
22 }
派生两个子类,接下来编写两个简单的派生类,他们实现了接口,在构造函数中将名字分成两个部分。
在firstFirst类中。做了一个简单的假设:最后一耳光空格前面所有的部分都属于姓"firstname"
using System;
2
3 namespace NameFactory
4 {
5 /// <summary>
6 ///
Summary description for FirstFirst.
7 /// </summary>
8 public class FirstFirst : Namer
9 {
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 }
在lastfirst、类中,用逗号给lastname划分界限。当空格逗号不存在是,两个类都提供了错误处理
1 using System;
2
3 namespace NameFactory
4 {
5 /// <summary>
6 ///
Summary description for LastFirst.
7 /// </summary>
8 public class LastFirst : Namer
9 {
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 }
工厂
1 using System;
2
3 namespace NameFactory
4 {
5 /// <summary>
6 /// Summary description for
NameFactory.
7 /// </summary>
8 public class NameFactory {
9 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 }
使用工厂
1 Namer nm =
nameFact.getName (txName.Text );
2 txFirst.Text = nm.getFrname
();
3 txLast.Text =
nm.getLname ();
简单工厂具有同样方法类 的实例,他可以是不同派生子类的实例,也可以是实际上毫无关系仅仅是共享了相同接口的类。不管是哪种形式,这些类实例中的方法必须是相同的