工厂方法模式(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();
        }
    }
}

 

posted @ 2013-02-21 11:06  xiepeixing  阅读(220)  评论(0编辑  收藏  举报