为了对一个类进行实例化,通常使用这个类的构成函数,但是有时候出现这类情况:几个类实现了同一个接口,具有同样的操作、返回了同样的抽象类型,不知道该为哪个类型创建对象,因为需要根据条件来控制对哪个类进行实例化,并且此时类的数量可能增减,接口却是稳定的。我们需要工厂方法模式!
我们遇见一个.NET中的经典实例就是枚举器。Enumerator的 GetEnumerator()的方法是一个用了工厂方法模式的例子。这个方法将调用者与需要进行实例化的类隔离开来了。
需要指出的是并不是能够创建并返回一个对象的方法都是工厂方法。工厂方法模式需要包括一个方法,这个方法创建并返回一个对象,同时客户无需要了解应该具体去实例化哪个类。
我们再看另外一个例子:
using
System;
using System.Collections.Generic;
using System.Text;
namespace FactoryMethod
... {
/**//// <summary>
/// 机器
/// </summary>
public abstract class Machine
...{
public abstract void Print();
}
/**///// <summary>
/// 打印机
/// </summary>
public class Printer : Machine
...{
public override void Print()
...{
Console.WriteLine("Printer");
}
}
/**///// <summary>
/// 复印机
/// </summary>
public class Copycat : Machine
...{
public override void Print()
...{
Console.WriteLine("Copycat");
}
}
/**//// <summary>
/// MachineFactory 类
/// </summary>
public abstract class MachineFactory
...{
public abstract Machine Create();
}
/**//// <summary>
/// PrinterFactory 类
/// </summary>
public class PrinterFactory : MachineFactory
...{
public override Machine Create()
...{
return new Printer();
}
}
/**//// <summary>
/// CopycatFactory 类
/// </summary>
public class CopycatFactory : MachineFactory
...{
public override Machine Create()
...{
return new Copycat();
}
}
class Program
...{
static void Main(string[] args)
...{
MachineFactory factory = null;
//根据条件判断创建哪个对象
bool conditon = true;
if (conditon)
...{
factory = new PrinterFactory();
}
else
...{
factory = new CopycatFactory();
}
Machine machine = factory.Create();
machine.Print();
Console.ReadLine();
}
}
}
using System.Collections.Generic;
using System.Text;
namespace FactoryMethod
... {
/**//// <summary>
/// 机器
/// </summary>
public abstract class Machine
...{
public abstract void Print();
}
/**///// <summary>
/// 打印机
/// </summary>
public class Printer : Machine
...{
public override void Print()
...{
Console.WriteLine("Printer");
}
}
/**///// <summary>
/// 复印机
/// </summary>
public class Copycat : Machine
...{
public override void Print()
...{
Console.WriteLine("Copycat");
}
}
/**//// <summary>
/// MachineFactory 类
/// </summary>
public abstract class MachineFactory
...{
public abstract Machine Create();
}
/**//// <summary>
/// PrinterFactory 类
/// </summary>
public class PrinterFactory : MachineFactory
...{
public override Machine Create()
...{
return new Printer();
}
}
/**//// <summary>
/// CopycatFactory 类
/// </summary>
public class CopycatFactory : MachineFactory
...{
public override Machine Create()
...{
return new Copycat();
}
}
class Program
...{
static void Main(string[] args)
...{
MachineFactory factory = null;
//根据条件判断创建哪个对象
bool conditon = true;
if (conditon)
...{
factory = new PrinterFactory();
}
else
...{
factory = new CopycatFactory();
}
Machine machine = factory.Create();
machine.Print();
Console.ReadLine();
}
}
}