目录
定义
简单工厂模式属于创建型模式,又叫静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建哪一种产品的实例。
UML类图
角色
工厂(Factory):静态工厂,整个简单工厂模式的核心部分,里面有负责创建所有具体类产品实例的内部逻辑。工厂类的创建对象的方法可以根据参数直接被外界调用。
抽象产品类(Product):是工厂所创建的所有对象的父类。
具体产品类(ConceteProduct):是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
优点
1.简单工厂模式包含了创建对象的逻辑判断,根据参数决定要创建哪个对象。外界只需要知道参数就可以了。
2.用户程序从直接创建对象中摆脱出来,不需要知道对象是如何创建的。
缺点
1.由于工厂类集中了所有实例的创建逻辑,如果类过多,内部逻辑会变得复杂。
2.所有创建对象逻辑集中在工厂类,如果需要添加新的类,要改变工厂中的逻辑,不符合“开闭”原则。
适用场景
1.工厂类负责创建的对象比较少;
2.客户只知道传入工厂类的参数,对于如何创建对象不关心
举例
public abstract class Phone
{
//抽象方法开机、关机、玩手机
public abstract void Start();
public abstract void Off();
public abstract void Play();
}
Phone为产品抽象类,是下面HuaweiPhone和OPPOPhone的父类,对应类图中的IProduct
public class HuaweiPhone:Phone
{
//实现父类的抽象方法
public override void Start()
{
Console.WriteLine("华为手机开机");
Console.ReadKey();
}
public override void Off()
{
Console.WriteLine("华为手机关机");
}
public override void Play()
{
Console.WriteLine("玩华为手机了");
}
}
HuaweiPhone对应UML类图中的ConcreteProductA,是对抽象产品Phone的继承,并且实现父类中的抽象方法
public class OPPOPhone : Phone
{
//实现父类的抽象方法
public override void Start()
{
Console.WriteLine("OPPO手机开机");
Console.ReadKey();
}
public override void Off()
{
Console.WriteLine("OPPO手机关机");
}
public override void Play()
{
throw new NotImplementedException("玩OPPO手机了");
}
}
OPPOPhone对应UML类图中的ConcreteProductB,是对抽象产品Phone的继承,并且实现父类中的抽象方法
public class PhoneFactory
{
public static Phone CreatePhone(string type)
{
Phone phone = null;
if (type=="HuaweiPhone")
{
phone = new HuaweiPhone(); //创建一个HuaweiPhone类实例
}
else
{
phone = new OPPOPhone(); //创建一个OPPOPhone类实例
}
return phone;
}
}
工厂类,对应类图中的Factory,包含创建手机对象的内部逻辑
class Program
{
static void Main(string[] args)
{
string type;
Console.WriteLine("Please input the type you want to crate"); //提示输入一种手机类型
type = Console.ReadLine(); //接收用户输入的类型
PhoneFactory.CreatePhone(type).Play();
PhoneFactory.CreatePhone(type).Off();
PhoneFactory.CreatePhone(type).Start();
}
}
客户程序,根据type参数创建对象
运行结果