工厂方法模式(Factory Method Pattern)
我们在简单工厂模式中, 将实例化对象的工作推迟到了专门负责创建对象的工厂类中,这样,在我们事先预知的情况下,可以根据我们的需要动态创建产品类。但是,我们的预知是有限的, 客户的变化可能是无限的。所以,就出现了问题,一旦客户的变化超越了我们的预知,我们就必须修改我们的源代码了。这是设计模式所不允许的,怎么办呢?工厂 方法模式正是解决此类问题的。
定义
工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂模式(Polymorphic Factory),在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成, 即由子类来决定究竟应该实例化(创建)哪一个类。
意图
定义一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到其子类。
参与者
· 抽象产品角色(Product)
定义产品的接口
· 具体产品角色(ConcreteProduct)
实现接口Product的具体产品类
· 抽象工厂角色(Creator)
声明工厂方法(FactoryMethod),返回一个产品
· 真实的工厂(ConcreteCreator)
实现FactoryMethod工厂方法,由客户调用,返回一个产品的实例
工厂方法模式UML图
实例一:
namespace Test { public interface ICoat { void ShowCoat(); } public class BusinessCoat : ICoat { public void ShowCoat() { Console.WriteLine("这件是商务上衣"); } } public class FashionCoat : ICoat { public void ShowCoat() { Console.WriteLine("这件是时尚上衣"); } } public interface IFactory { ICoat CreateCoat(); } public class BusinessCoatFactory : IFactory { public ICoat CreateCoat() { return new BusinessCoat(); } } public class FashionCoatFactory : IFactory { public ICoat CreateCoat() { return new FashionCoat(); } } class Client { static void Main(string[] args) { IFactory f1 = new BusinessCoatFactory(); IFactory f2 = new FashionCoatFactory(); ICoat c1 = f1.CreateCoat(); ICoat c2 = f2.CreateCoat(); c1.ShowCoat(); c2.ShowCoat(); } } }
实例二:
namespace Test { public abstract class Light { public abstract void TurnOn(); public abstract void TurnOff(); } public class BulbLight : Light { public override void TurnOn() { Console.WriteLine("Bulb Light is Turned on"); } public override void TurnOff() { Console.WriteLine("Bulb Light is Turned off"); } } public class TubeLight : Light { public override void TurnOn() { Console.WriteLine("Tube Light is Turned on"); } public override void TurnOff() { Console.WriteLine("Tube Light is Turned off"); } } public abstract class Creator { public abstract Light factory(); } public class BulbCreator : Creator { public override Light factory() { return new BulbLight(); } } public class TubeCreator : Creator { public override Light factory() { return new TubeLight(); } } public class Client { public static void Main() { Creator c1 = new BulbCreator(); Creator c2 = new TubeCreator(); Light l1 = c1.factory(); Light l2 = c2.factory(); l1.TurnOn(); l1.TurnOff(); Console.WriteLine("-----------------"); l2.TurnOn(); l2.TurnOff(); } } }