设计模式-工厂方法模式
接上文的简单工厂模式
简单工厂模式中讲到了几条缺点,其中之一便是扩展困难,一旦添加新产品就不得不修改简单工厂方法,违背了设计模式的开闭原则,工厂方法的出现能够解决这个问题。
定义:工厂方法模式定义一个创建产品的接口,将实际创建产品的工作延迟到子类中。
结构:
AbstractFactory (抽象工厂)
提供了创建产品的接口,不负责具体产品的创建,抽象工厂可以是抽象类,也可以是一个接口
ConcreteFactory(具体工厂)
继承 AbstractFactory,实现AbstractFactory 创建对象的接口,负责具体产品的创建。
Product (抽象、接口 产品)
工厂模式所创建的所有对象对应类的父类或接口
Concrete Product (具体产品)
工厂创建的目标
结构上对比简单工厂模式就是将工厂也进行了抽象,可以有多个不同的工厂,每个工厂分别负责创建不同的产品。
同样以汽车工厂为例,在简单工厂中一个工厂可以生产多个类型的汽车,导致一个工厂需要处理不同的逻辑判断,经过结构优化,公司决定对工厂进行拆分,将工厂职责单一化,根据汽车类型建立不同的工厂,于是将一个工厂拆分为如下几个工厂
小轿车工厂
公共汽车工厂
校车工厂
汽车抽象类、接口以及汽车具体类如下
// 汽车接口
public interface ICar
{
void Print();
}
// 小轿车
public class SaloonCar : ICar
{
public void Print()
{
Console.WriteLine("这是小轿车");
}
}
// 公共汽车
public class Bus : ICar
{
public void Print()
{
Console.WriteLine("这是公共汽车");
}
}
// 校车
public class SchoolBus : ICar
{
public void Print()
{
Console.WriteLine("这是校车");
}
}
抽象工厂/工厂接口,以及具体工厂类如下
/// <summary>
/// 汽车工厂接口
/// </summary>
public interface ICarFactory
{
// 声明创建汽车的接口
ICar Create();
}
// 小轿车的工厂
public class SaloonCarFactory : ICarFactory
{
public ICar Create()
{
ICar icar = new SaloonCar();
return icar;
}
}
// 公共汽车的工厂
public class BusFactory : ICarFactory
{
public ICar Create()
{
ICar icar = new Bus();
return icar;
}
}
// 校车工厂
public class SchoolBusFactory : ICarFactory
{
public ICar Create()
{
ICar icar = new SchoolBus();
return icar;
}
}
具体调用如下
class Customer
{
public Customer()
{
// 创建一个小轿车的工厂
SaloonCarFactory saloonCarFactory = new SaloonCarFactory();
// 小轿车工厂生产小轿车
ICar saloonCar = saloonCarFactory.Create();
saloonCar.Print();
// 创建一个公共汽车的工厂
BusFactory busFactory = new BusFactory();
// 公共汽车工厂生产公共汽车
ICar busCar = busFactory.Create();
busCar.Print();
// 创建一个校车的工厂
SchoolBusFactory schoolBusFactory = new SchoolBusFactory();
// 校车工厂生产校车
ICar schoolBus = schoolBusFactory.Create();
schoolBus.Print();
}
}
优点:
(1)用户只需要知道具体工厂的类就可以创建需要的产品,无需知道具体的创建过程
(2)灵活,多一种产品,只需要增加一个相应的工厂类,原有工厂类无需修改
缺点:
(1)类的数量较多,增加一个产品还需要同时增加一个具体工厂类
(2)一个工厂只能生产一种产品
(3)引入了更多的抽象层,增加了系统的抽象性和理解难度