三、设计模式之工厂模式--抽象工厂模式--创建型模式

抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

抽象工厂模式类图如下:

 

抽象工厂(Interface Creator/Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
具体工厂(Concrete Creator/Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
抽象产品(Interface Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品(Concrete Product)角色:这个角色用以代表具体的产品。
抽象工厂模式就相当于创建实例对象的new,由于经常要根据类生成实例对象,抽象工厂模式也是用来创建实例对象的,所以在需要新的事例对象时便可以考虑是否使用工厂模式。虽然这样做可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
 
示例:
using System;

namespace FactoryMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            //IFoodFactory beiFangfactory = new BeiFangZongZiFactory();
            //IJiaoZi beifangjiaozi = beiFangfactory.CreateJiaoZi("芹菜");
            //beifangjiaozi.Prepare();
            //beifangjiaozi.Ok();

            //IZongzi beifangzongzi = beiFangfactory.CreateZongZi("五香");
            //beifangzongzi.Prepare();
            //beifangzongzi.Ok();
            
            IFoodFactory NanFangfactory = new NanFangZongZiFactory();
            IJiaoZi beifangjiaozi = NanFangfactory.CreateJiaoZi("芹菜");
            beifangjiaozi.Prepare();
            beifangjiaozi.Ok();

            IZongzi beifangzongzi = NanFangfactory.CreateZongZi("五香");
            beifangzongzi.Prepare();
            beifangzongzi.Ok();
            
            Console.ReadKey();

        }
    }

    /// <summary>
    /// 抽象产品 粽子
    /// </summary>
    interface IZongzi
    {
        void Prepare();
        void Ok();
    }

    /// <summary>
    /// 抽象产品 饺子
    /// </summary>
    interface IJiaoZi
    {
        void Prepare();
        void Ok();
    }


    /// <summary>
    /// 带皮的具体产品,饺子
    /// </summary>
    public class NanFangJiaoZi : IJiaoZi
    {
        public NanFangJiaoZi(string name)
        {
            Name = name;
        }

        public string Name { get; private set; }
        public void Prepare()
        {
            Console.WriteLine("南方" + Name + "饺子,已经准备好。");
        }

        public void Ok()
        {
            Console.WriteLine("南方" + Name + "饺子,可以开吃。");
        }
    }

    /// <summary>
    /// 带皮的具体产品,饺子
    /// </summary>
    public class BeiFangJiaoZi : IJiaoZi
    {
        public BeiFangJiaoZi(string name)
        {
            Name = name;
        }

        public string Name { get; private set; }
        public void Prepare()
        {
            Console.WriteLine("北方" + Name + "饺子,已经准备好。");
        }

        public void Ok()
        {
            Console.WriteLine("北方" + Name + "饺子,可以开吃。");
        }
    }

    /// <summary>
    /// 带皮的具体产品,粽子
    /// </summary>
    public class NanFangZongZi : IZongzi
    {

        public NanFangZongZi(string name)
        {
            Name = name;
        }

        public string Name { get; private set; }
        public void Prepare()
        {
            Console.WriteLine("南方" + Name + "甜粽子,已经准备好。");
        }

        public void Ok()
        {
            Console.WriteLine("南方" + Name + "甜粽子,可以开吃。");
        }
    }

    /// <summary>
    /// 带皮的具体产品,粽子
    /// </summary>
    public class BeiFangZongZi : IZongzi
    {

        public BeiFangZongZi(string name)
        {
            Name = name;
        }

        public string Name { get; private set; }
        public void Prepare()
        {
            Console.WriteLine("北方" + Name + "甜粽子,已经准备好。");
        }

        public void Ok()
        {
            Console.WriteLine("北方" + Name + "甜粽子,可以开吃。");
        }
    }

    /// <summary>
    /// 粽子工厂方法,抽象的
    /// </summary>
    interface IFoodFactory
    {
        IZongzi CreateZongZi(string name);
        IJiaoZi CreateJiaoZi(string name);
    }

    /// <summary>
    /// 具体粽子工厂,北方粽子工厂
    /// </summary>
    class BeiFangZongZiFactory : IFoodFactory
    {
        public IZongzi CreateZongZi(string name)
        {
            return new BeiFangZongZi(name);
        }

        public IJiaoZi CreateJiaoZi(string name)
        {
            return new BeiFangJiaoZi(name);
        }
    }


    /// <summary>
    /// 具体粽子工厂,南方粽子工厂
    /// </summary>
    class NanFangZongZiFactory : IFoodFactory
    {
        public IZongzi CreateZongZi(string name)
        {
            return new NanFangZongZi(name);
        }

        public IJiaoZi CreateJiaoZi(string name)
        {
            return new NanFangJiaoZi(name);
        }
    }

}
View Code

运行结果如下:

示例解析:
示例中IZongzi接口对应类图中的Interface ProductA或者Interface ProductB;对方的产品实现NanFangJiaoZi,BeiFangJiaoZ,NanFangZongZii,BeiFangZongZi分别是接口对应的实现。IFoodFactory对应抽象工厂类图中的Interface ICreator,BeiFangZongZiFactory和NanFangZongZiFactory对应类图中的concerteCreater,是抽象工厂类图的具体实现,在具体实现中创建对应的具体产品。
工厂模式优缺点:
优点:消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。
缺点:当具体产品修改时,相应的工厂类也要做相应的修改。
上面只是理论上的抽象工厂模式,在实际的项目中都使用抽象工厂和配置文件结合使用。
 
posted @ 2014-06-15 21:31  mopheify  阅读(160)  评论(0)    收藏  举报