意图
专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式不属于23个GOF模式。
简单工厂模式中涉及到的角色
1) 抽象产品角色:定义具体产品角色要实现的接口。可以用一个接口或者抽象类实现。
2) 具体产品角色:实现抽象产品角色所定义的接口。
3) 工厂角色:该角色是简单工厂模式的核心。通常根据参数创建一个具体产品的实例。
一个例子
在程序中,要用到一个车的类,就创建一个实例,但当车很多变时,会不断的有新的车出现,那么每次都要增加一个新的车类,还要修改客户程序。使用简单工厂模式可以减少修改的地方。
using System;
namespace Pattern.SimpleFactory
{
public class Test
{
public static void Main()
{
Car car;
Label_001:
Console.Write("请输入车名:");
string carType = Console.ReadLine();
car = CarFactory.GetCar(carType); // 返回车的实例。
if (car == null)
{
Console.Write("可能没有这辆车。");
Console.WriteLine();
goto Label_001;
}
car.Start();
car.Run();
car.Stop();
Console.WriteLine();
goto Label_001;
//Console.ReadKey();
}
}
// 1) 抽象产品角色:定义具体产品角色要实现的接口。可以用一个接口或者抽象类实现。
public abstract class Car
{
public abstract void Start();
public abstract void Run();
public abstract void Stop();
}
// 2) 具体产品角色:实现抽象产品角色所定义的接口。
public class Benz : Car
{
public override void Start()
{
Console.WriteLine("The Benz Car Start.");
}
public override void Run()
{
Console.WriteLine("The Benz Car Running.");
}
public override void Stop()
{
Console.WriteLine("The Benz Car Stop.");
}
}
public class BWM : Car
{
public override void Start()
{
Console.WriteLine("The BWM Car Start.");
}
public override void Run()
{
Console.WriteLine("The BWM Car Running.");
}
public override void Stop()
{
Console.WriteLine("The BWM Car Stop.");
}
}
// 3) 工厂角色:该角色是简单工厂模式的核心。通常根据参数创建一个具体产品的实例。
public class CarFactory
{
public static Car GetCar(string carType)
{
if (carType == "Benz")
{
return new Benz();
}
else if (carType == "BWM")
{
return new BWM();
}
else
{
return null;
}
}
}
}
using System;
namespace Pattern.SimpleFactory
{
public class Test
{
public static void Main()
{
Car car;
Label_001:
Console.Write("请输入车名:");
string carType = Console.ReadLine();
car = CarFactory.GetCar(carType); // 返回车的实例。
if (car == null)
{
Console.Write("可能没有这辆车。");
Console.WriteLine();
goto Label_001;
}
car.Start();
car.Run();
car.Stop();
Console.WriteLine();
goto Label_001;
}
}
}
using System;
using System.Reflection;
namespace Pattern.SimpleFactory
{
public abstract class Car
{
public abstract void Start();
public abstract void Run();
public abstract void Stop();
}
public class Benz : Car
{
public override void Start()
{
Console.WriteLine("The Benz Car Start.");
}
public override void Run()
{
Console.WriteLine("The Benz Car Running.");
}
public override void Stop()
{
Console.WriteLine("The Benz Car Stop.");
}
}
public class BWM : Car
{
public override void Start()
{
Console.WriteLine("The BWM Car Start.");
}
public override void Run()
{
Console.WriteLine("The BWM Car Running.");
}
public override void Stop()
{
Console.WriteLine("The BWM Car Stop.");
}
}
public class CarFactory
{
public static Car GetCar(string carType)
{
Car car;
try
{
// 根据参数确定类名,再创建类的实例,要指定,类所在的.dll文件名和完整的类名(含名字空间)
car = (Car)Assembly.Load("DLL").CreateInstance("Pattern.SimpleFactory." + carType);
}
catch
{
car = null;
}
return car;
}
}
}
总结(2008-6-13)
如果具体产品角色要增加就修改工厂角色类。不过通 Assembly 类可以不修改工厂角色类。



