1。概述
工厂方法是一个粒度很小的设计模式,因为模式的表现只是一个抽象的方法。工厂方法主要创建与某个类相关的类的实例。
2。意图
定义一个用于创建对象的接口(这里是一个抽象的方法),让包含这个接口的类的子类决定到底实例化哪一个类。工厂方法使一个类的实例化延迟到了子类。
3。使用场合
当一个类不知道它具体要创建对象的类或者一个类希望由子类指定它所创建的对象时,可是使用工厂方法模式。
4。效果
工厂方法使类中的代码不依赖它必须创建的类,代码只要知道它需要创建的类的接口。工厂方法的缺点是新增加一个需要创建的类,就需要增加一个相应的子类。
5。程序实例
我们先看一个小的例子,这个例子主要是获得不同类的实例的迭代器。程序如下:
using
System;
using System.Collections;
namespace FactoryMethod2
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main( string [] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
ArrayList ar = new ArrayList();
IEnumerator e = ar.GetEnumerator();
System.Console.WriteLine(ar.GetType().Name + " 的迭代器类型 " + e.GetType().Name);
String s = "" ;
IEnumerator se = s.GetEnumerator();
System.Console.WriteLine(s.GetType().Name + " 的迭代器类型 " + se.GetType().Name);
System.Console.ReadLine();
}
}
}
using System.Collections;
namespace FactoryMethod2
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main( string [] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
ArrayList ar = new ArrayList();
IEnumerator e = ar.GetEnumerator();
System.Console.WriteLine(ar.GetType().Name + " 的迭代器类型 " + e.GetType().Name);
String s = "" ;
IEnumerator se = s.GetEnumerator();
System.Console.WriteLine(s.GetType().Name + " 的迭代器类型 " + se.GetType().Name);
System.Console.ReadLine();
}
}
}
运行的结果如图:
6。工厂方法的结构
结构如图:
7。一个更加形象的例子---鸟生蛋
该例子的类图如下:
下面是程序的源代码:
鸟的类,它包含一个Produce()的抽象方法
using
System;
namespace FactoryMethod
{
/// <summary>
/// Bird 的摘要说明。
/// </summary>
public abstract class Bird
{
#region 属性
protected string name;
#endregion
#region 方法
public Bird()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public Bird(string name)
{
this.name= name;
}
public string Name
{
get
{
return this .name;
}
}
public abstract Egg Produce();
#endregion
}
}
namespace FactoryMethod
{
/// <summary>
/// Bird 的摘要说明。
/// </summary>
public abstract class Bird
{
#region 属性
protected string name;
#endregion
#region 方法
public Bird()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public Bird(string name)
{
this.name= name;
}
public string Name
{
get
{
return this .name;
}
}
public abstract Egg Produce();
#endregion
}
}
鸡的类,它从鸟类继承下来
using
System;
namespace FactoryMethod
{
/// <summary>
/// Class2 的摘要说明。
/// </summary>
public class Chicken:Bird
{
public Chicken()
{
//
// TODO: 在此处添加构造函数逻辑
//
this .name = " 鸡 " ;
}
public override Egg Produce()
{
return new ChickenEgg();
}
}
}
namespace FactoryMethod
{
/// <summary>
/// Class2 的摘要说明。
/// </summary>
public class Chicken:Bird
{
public Chicken()
{
//
// TODO: 在此处添加构造函数逻辑
//
this .name = " 鸡 " ;
}
public override Egg Produce()
{
return new ChickenEgg();
}
}
}
鸭子的类,从鸟类中继承
using
System;
namespace FactoryMethod
{
/// <summary>
/// Duck 的摘要说明。
/// </summary>
public class Duck:Bird
{
public Duck()
{
//
// TODO: 在此处添加构造函数逻辑
//
this .name = " 鸭 " ;
}
public override Egg Produce()
{
return new DuckEgg();
}
}
}
namespace FactoryMethod
{
/// <summary>
/// Duck 的摘要说明。
/// </summary>
public class Duck:Bird
{
public Duck()
{
//
// TODO: 在此处添加构造函数逻辑
//
this .name = " 鸭 " ;
}
public override Egg Produce()
{
return new DuckEgg();
}
}
}
蛋类,它是一个抽象的类
using
System;
namespace FactoryMethod
{
/// <summary>
/// Egg 的摘要说明。
/// </summary>
public class Egg
{
#region 属性
protected string name;
#endregion
#region 方法
public Egg()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public Egg( string name)
{
this .name = name;
}
public string Name
{
get
{
return this .name;
}
}
#endregion
}
}
namespace FactoryMethod
{
/// <summary>
/// Egg 的摘要说明。
/// </summary>
public class Egg
{
#region 属性
protected string name;
#endregion
#region 方法
public Egg()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public Egg( string name)
{
this .name = name;
}
public string Name
{
get
{
return this .name;
}
}
#endregion
}
}
鸡蛋的类(从蛋类继承)
using
System;
namespace FactoryMethod
{
/// <summary>
/// ChickenEgg 的摘要说明。
/// </summary>
public class ChickenEgg:Egg
{
public ChickenEgg()
{
//
// TODO: 在此处添加构造函数逻辑
//
this.name="鸡蛋" ;
}
}
}
namespace FactoryMethod
{
/// <summary>
/// ChickenEgg 的摘要说明。
/// </summary>
public class ChickenEgg:Egg
{
public ChickenEgg()
{
//
// TODO: 在此处添加构造函数逻辑
//
this.name="鸡蛋" ;
}
}
}
鸭蛋的类(从蛋类继承)
using
System;
namespace FactoryMethod
{
/// <summary>
/// DuckEgg 的摘要说明。
/// </summary>
public class DuckEgg:Egg
{
public DuckEgg()
{
//
// TODO: 在此处添加构造函数逻辑
//
this.name="鸭蛋" ;
}
}
}
namespace FactoryMethod
{
/// <summary>
/// DuckEgg 的摘要说明。
/// </summary>
public class DuckEgg:Egg
{
public DuckEgg()
{
//
// TODO: 在此处添加构造函数逻辑
//
this.name="鸭蛋" ;
}
}
}
客户端程序
using
System;
namespace FactoryMethod
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main( string [] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
Chicken chicken = new Chicken();
System.Console.WriteLine(chicken.Name + " 生 " + chicken.Produce().Name);
Duck duck = new Duck();
System.Console.WriteLine(duck.Name + " 生 " + duck.Produce().Name);
System.Console.ReadLine();
}
}
}
namespace FactoryMethod
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main( string [] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
Chicken chicken = new Chicken();
System.Console.WriteLine(chicken.Name + " 生 " + chicken.Produce().Name);
Duck duck = new Duck();
System.Console.WriteLine(duck.Name + " 生 " + duck.Produce().Name);
System.Console.ReadLine();
}
}
}
程序运行的结果如下: