设计模式-简单工厂模式
定义:由一个工厂类根据传入参数,动态决定创建哪一个产品类(这些产品类继承自一个父类或接口)
结构:
Factory (工厂)
负责实现创建所有实例的内部逻辑,工厂类创建产品的方法可以被外界直接访问,一般定义为静态方法 (static),所以有时候也叫静态工厂方法。
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("这是校车");
}
}
定义一个产品类型枚举
//汽车类型枚举
public enum CarType
{
//小轿车
SALOON_CAR,
//公共汽车
BUS,
//校车
SCHOOL_BUS,
}
定义工厂类
// 汽车简单工厂
class CarSimpleFactory
{
// 方便外界直接调用,使用了静态方法
public static ICar Create(CarType type)
{
ICar car = null;
// 根据枚举类型创建不同的车
switch (type)
{
case CarType.SALOON_CAR:
car = new SaloonCar();
break;
case CarType.BUS:
car = new Bus();
break;
case CarType.SCHOOL_BUS:
car = new SchoolBus();
break;
default:
break;
}
return car;
}
}
工厂类使用如下
public class Customer
{
public Customer()
{
// 创建一个小轿车
ICar sallonCar = CarSimpleFactory.Create(CarType.SALOON_CAR);
sallonCar.Print();
// 创建一个公共汽车
ICar bus = CarSimpleFactory.Create(CarType.BUS);
bus.Print();
// 创建校车
ICar schoolBus = CarSimpleFactory.Create(CarType.SCHOOL_BUS);
schoolBus.Print();
}
}
优点:
(1)工厂类对产品的创建进行了封装,包含了必要的判断逻辑,客户只要根据自己的需求传入不同的参数得到具体的产品。
(2)由于客户无需关心具体创建逻辑,避免了客户直接创建对象,客户无需知道具体的产品类名,降低了客户类与具体产品类的耦合。
(3)可以根据配置在不改变代码的情况下,动态的修改创建的具体产品类型。
缺点:
(1)工厂类集中了所有的创建逻辑,职责过重,一旦出现异常,整个系统将受到影响
(2)扩展困难,一旦需要增加新产品,不得不修改工厂逻辑,违法了设计模式的开闭原则