一、引言
在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题,下面就具体看看工厂模式是如何解决该问题的。
二、工厂方法模式的实现
工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中缺点。
public abstract class BMW
{
public BMW()
{
}
}
public class BMW320 : BMW
{
public BMW320()
{
Console.WriteLine("制造-->BMW320");
}
}
public class BMW523 : BMW
{
public BMW523()
{
Console.WriteLine("制造-->BMW523");
}
}
/// <summary>
/// 抽象工厂类
/// </summary>
public abstract class FactoryBMW
{
/// <summary>
/// 工厂方法
/// </summary>
/// <returns></returns>
public abstract BMW CreateBMW();
}
public class FactoryBMW320 : FactoryBMW
{
public override BMW CreateBMW()
{
return new BMW320();
}
}
public class FactoryBMW523 : FactoryBMW
{
public override BMW CreateBMW()
{
return new BMW523();
}
}
public class Customer
{
public static void Main()
{
FactoryBMW320 factoryBMW320 = new FactoryBMW320();
BMW bmw320 = factoryBMW320.CreateBMW();
FactoryBMW523 factoryBMW523 = new FactoryBMW523();
BMW bmw523 = factoryBMW523.CreateBMW();
}
}
使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。例如,我们的车型又多了911,此时我们只需要定义一个911具体工厂类和911子类就可以。而不用像简单工厂模式中那样去修改工厂类中的实现(具体指添加case语句)。
public class BMW911 : BMW
{
public BMW911()
{
Console.WriteLine("制造-->BMW911");
}
}
public class FactoryBMW911 : FactoryBMW
{
public override BMW CreateBMW()
{
return new BMW911();
}
}
public class Customer
{
public static void Main()
{
FactoryBMW320 factoryBMW320 = new FactoryBMW320();
BMW bmw320 = factoryBMW320.CreateBMW();
FactoryBMW523 factoryBMW523 = new FactoryBMW523();
BMW bmw523 = factoryBMW523.CreateBMW();
FactoryBMW911 factoryBMW911 = new FactoryBMW911();
BMW bmw911 = factoryBMW911.CreateBMW();
}
}
在工厂方法模式中,工厂类与具体产品类具有平行的等级结构,它们之间是一一对应的。
FactoryBMW 类:充当抽象工厂角色,任何具体工厂都必须继承该抽象类
FactoryBMW320 和 FactoryBMW523 类:充当具体工厂角色,用来创建具体产品
BMW 类:充当抽象产品角色,具体产品的抽象类。任何具体产品都应该继承该类
BMW320 和 BMW523 类:充当具体产品角色,实现抽象产品类对定义的抽象方法,由具体工厂类创建,它们之间有一一对应的关系。
三、总结
工厂方法模式通过面向对象编程中的多态性来将对象的创建延迟到具体工厂中,从而解决了简单工厂模式中存在的问题,也很好地符合了开放封闭原则(即对扩展开发,对修改封闭)。
工厂模式(Factory Pattern)
定义:Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)
简单工厂模式:
一个模块仅需要一个工厂类,没有必要把它产生出来,使用静态的方法
多个工厂类:
每个人种(具体的产品类)都对应了一个创建者,每个创建者独立负责创建对应的产品对象,非常符合单一职责原则
代替单例模式:
单例模式的核心要求就是在内存中只有一个对象,通过工厂方法模式也可以只在内存中生产一个对象
延迟初始化:
ProductFactory负责产品类对象的创建工作,并且通过prMap变量产生一个缓存,对需要再次被重用的对象保留
使用场景:jdbc连接数据库,硬件访问,降低对象的产生和销毁
缺点:
工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口,但使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。