根据提供给它的数据,返回几个可能类中的一个实例,通常返回的类是公共的父类,公共的方法或接口。
工厂类角色:工厂类在客户端的直接控制下创建产品对象
抽象产品角色:定义简单工厂创建的对象的父类或它们共同拥有的接口,可以是一个类,抽象类或接口。
具体产品角色:定义工厂具体加工出的对象。
using System;
using System.Collections.Generic;
using System.Text;
namespace Simple_Factory
{
/// <summary>
/// 抽象类
/// </summary>
public abstract class Light
{
public abstract void TurnOn();
public abstract void TurnOff();
}
/// <summary>
/// 实体类1
/// </summary>
public class BulbLight:Light
{
public override void TurnOn()
{
Console.WriteLine("Bulb Light is Turned on");
}
public override void TurnOff()
{
Console.WriteLine("Bulb Light is Turned off");
}
}
/// <summary>
/// 实体类2
/// </summary>
public class TubeLight:Light
{
public override void TurnOn()
{
Console.WriteLine("Tube Light is Turned on");
}
public override void TurnOff()
{
Console.WriteLine("Tube Light is Turned off");
}
}
/// <summary>
/// 工厂类
/// </summary>
public class LightSimpleFactory
{
public Light Create(string LightType)
{
switch(LightType)
{
case "Bulb": return new BulbLight();
case "Tube": return new TubeLight();
default: return null;
}
}
}
/// <summary>
/// 客户端
/// </summary>
class Program
{
static void Main(string[] args)
{
LightSimpleFactory lsf = new LightSimpleFactory();
Light l = lsf.Create("Bulb");
l.TurnOn();
l.TurnOff();
}
}
}
模式演化:
将工厂放在抽象产品中
using System;
using System.Collections.Generic;
using System.Text;
namespace Simple_Factory
{
public class Light
{
public virtual void TurnOn(){}
public virtual void TurnOff() {}
public static Light Create(string LightType)
{
switch(LightType)
{
case "Bulb": return new BulbLight();
case "Tube": return new TubeLight();
default: return null;
}
}
}
public class BulbLight : Light
{
public override void TurnOn()
{
Console.WriteLine("Bulb Light is Turned on");
}
public override void TurnOff()
{
Console.WriteLine("Bulb Light is Turned off");
}
}
public class TubeLight : Light
{
public override void TurnOn()
{
Console.WriteLine("Tube Light is Turned on");
}
public override void TurnOff()
{
Console.WriteLine("Tube Light is Turned off");
}
}
class Simple_Factory2
{
public static void Main()
{
Light l = Light.Create("Bulb");
l.TurnOn();
l.TurnOff();
}
}
}
优点:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任。
缺点:
不利于扩展,如果需要添加产品就不得不修改工厂逻辑。