一、简介
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替了new操作的一种模式。因为工厂模式就相当于创建实例化对象的new,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给系统带来更大的可扩展性和尽量少的修改量。
二、定义
工厂模式是定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。
创建一个对象常常需要复杂的过程,所以不适合包含在一个复合对象中。创建对象可能会导致大量的重复代码,可能会需要复合对象访问不到的信息,也可能提供不了足够级别的抽象,还可能并不是复合对象概念的一部分。工厂模式通过定义一个单独的创建对象的方法来解决这些问题。由子类实现这个方法来创建具体类型的对象。
对象创建中的有些过程包括决定创建哪个对象、管理对象的生命周期,以及管理特定对象的创建和销毁的概念。
三、称呼
工厂模式又称工厂方法模式,也可以称呼为虚拟构造器模式或者多态工厂模式,它属于创建型模式。
四、工厂模式VS简单工厂模式
由于使用了面向对象的多态性,工厂模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂模式可以允许系统在不修改工厂角色的情况下引进新产品。
五、优点
1.克服了简单工厂模式违背开放-封闭原则的缺点,又保留了封装对象创建过程中的优点。当添加新功能时,只需要添加一个具体工厂和具体产品就可以了,无须其他修改,充分发挥了可扩展性,降低客户端和工厂的耦合性。可以说工厂模式是简单工厂模式的进一步抽象和推广。
2.在工厂模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
3.基于工厂角色和产品角色的多态性设计是工厂模式的关键。它能够使工厂自主确定创建任何对象,而创建对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又称为多态工厂模式,是因为所有的具体工厂类都具有同一抽象父类。
六、缺点
1.在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
2.由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM(文档对象模型),反射等技术,增加了系统的实现难度。
七、适用性
1.当一个类不知道它所必须创建的对象的类的时候。在工厂模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建,客户端需要知道创建具体产品的工厂类。
2.当一个类希望由它的子类来指定它所创建的对象的时候。在工厂模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。
八、UML类图分析
九、C#代码分析
1.逻辑
public class PlayerStateBase
{
public void Start()
{
OnAdd();
}
public void Destroy()
{
OnDestroy();
}
protected virtual void OnAdd()
{
}
protected virtual void OnDestroy()
{
}
}
public class StatePoisoning : PlayerStateBase
{
protected override void OnAdd()
{
Console.WriteLine("-----AddStatePoisoning----");
}
protected override void OnDestroy()
{
Console.WriteLine("-----DeleStatePoisoning----");
}
}
public class StateSilnet : PlayerStateBase
{
protected override void OnAdd()
{
Console.WriteLine("-----AddStateSilnet----");
}
protected override void OnDestroy()
{
Console.WriteLine("-----DeleStateSilnet----");
}
}
public class StateInvincible : PlayerStateBase
{
protected override void OnAdd()
{
Console.WriteLine("-----AddStateInvincible----");
}
protected override void OnDestroy()
{
Console.WriteLine("-----DeleStateInvincible----");
}
}
2.工厂
interface IStateFactory
{
PlayerStateBase Create();
}
public class SilentStateFactory : IStateFactory
{
public PlayerStateBase Create()
{
return new StateSilnet();
}
}
public class PoisoningStateFactory : IStateFactory
{
public PlayerStateBase Create()
{
return new StatePoisoning();
}
}
public class InvincibleStateFactory : IStateFactory
{
public PlayerStateBase Create()
{
return new StateInvincible();
}
}