设计模式之抽象工厂模式

来源:互联网 发布:新热血英豪mac 编辑:程序博客网 时间:2024/05/16 07:09

前文中介绍了简单工厂模式和工厂方法模式,本文介绍工厂模式中的最后一种:抽象工厂模式。

应用场景:假设现在要模拟汽车生产这样一个过程,我们知道汽车生产包括:车门的生成、轮子的生产等等;

不同的汽车厂商生成的车门、轮子是不相同的,但所有的汽车都是由轮子、车门这些部件组成的,汽车的构成

是不变的,并且轮子、车门是构成汽车的一系列的对象,我们把构成一个事物的一系列抽象对象,封装成一个

抽象工厂,具体的事物(如宝马车)继承自这个抽象工厂,然后实现相关的接口即可。

代码:

namespace ConsoleTest.test{   public class AbstractFactoryTest    {       private CarFactory cf;       public void Test()       {           cf = new BMWFactory(); //           cf.CreateDoor();           cf.CreateWheel();           Console.ReadLine();       }    }    /// <summary>    /// 表示汽车的抽象工厂。    /// </summary>    abstract class CarFactory    {        public abstract IWheel CreateWheel();        public abstract IDoor CreateDoor();    }    /// <summary>    /// 轮子接口。    /// </summary>    interface IWheel    {        IWheel Create();    }    /// <summary>    /// 车门接口。    /// </summary>    interface IDoor    {        IDoor Create();    }    /// <summary>    /// 生产宝马车的工厂。    /// </summary>    class BMWFactory : CarFactory    {        /// <summary>        /// 生成轮子。        /// </summary>        /// <returns></returns>        override public IWheel CreateWheel()        {            return new BMWWheel().Create();        }        /// <summary>        /// 生成车门。        /// </summary>        /// <returns></returns>        override public IDoor CreateDoor()        {            return new BMWDoor().Create();        }    }    /// <summary>    /// 宝马轮子。    /// </summary>    class BMWWheel : IWheel    {       public IWheel Create()        {           Console.WriteLine("生成宝马轮子...");           return this;        }    }    /// <summary>    /// 宝马车门。    /// </summary>    class BMWDoor : IDoor    {                public IDoor Create()        {            Console.WriteLine("生成宝马车门...");            return this;        }    }}

从代码可以看出,在具体的客户类AbstractFactoryTest中只需要保存抽象工厂类CarFactory就可以了,在使用时动态实例化为需要的工厂(BMWFactory),这样就将客户类与具体的对象解耦了。