首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式:抽象工厂方法模式

设计模式:抽象工厂方法模式

作者头像
lpxxn
发布2018-01-31 11:00:28
4100
发布2018-01-31 11:00:28
举报
文章被收录于专栏:技术之路技术之路

今天说一下抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的具体产品是什么,这样一来,客户就从具体的产品中被解耦

我之前说过设计模式:工厂方法模式,我们最后会做一下两种模式的区别

我们看用类图看一下这个模式

每个抽象产品都有多于一个的一个人的具体子类,工厂角色怎么知道实例化哪一个子类?比如我们这个图,每个抽象产品都有两个具体产品,

抽象工厂有两个具体的工厂,分别对应这两个具体产品角色,每一个具体工厂只负责某一个家族的产品的实例化

我们来看一下代码

#region 抽象工厂模式

    #region 产品
    #region 产品A
    /// <summary>
    /// 抽象产品A
    /// </summary>
    public abstract class ProductA
    {

    }

    public class ConcreteProductA1 : ProductA
    {
        public ConcreteProductA1()
        {
            Console.WriteLine("ProductA的ConcreteProductA1...A1");
        }
    }
    public class ConcreteProductA2 : ProductA
    {
        public ConcreteProductA2()
        {
            Console.WriteLine("ProductA的ConcreteProductA2...A2");
        }
    }
    #endregion

    #region 产品B
    /// <summary>
    /// 抽象产品B
    /// </summary>
    public abstract class ProductB
    {

    }

    public class ConcreteProductB1 : ProductB
    {
        public ConcreteProductB1()
        {
            Console.WriteLine("ProductB的ConcreteProductB1类...B1");
        }
    }
    public class ConcreteProductB2 : ProductB
    {
        public ConcreteProductB2()
        {
            Console.WriteLine("ProductB的ConcreteProductB2类...B2");
        }
    }

    #endregion

    #endregion


    #region 工厂类
    public abstract class Creator
    {
        public abstract ProductA CreateProductA();
        public abstract ProductB CreateProductB();
    }

    public class ConcreteCreatorA : Creator
    {
        public override ProductA CreateProductA()
        {
            return new ConcreteProductA1();
        }

        public override ProductB CreateProductB()
        {
            return new ConcreteProductB1();
        }
    }

    public class ConcreteCreatorB : Creator
    {
        public override ProductA CreateProductA()
        {
            return new ConcreteProductA2();
        }

        public override ProductB CreateProductB()
        {
            return new ConcreteProductB2();
        }
    }

    #endregion
    #endregion  
//Client
        static void Main(string[] args)
        {            

            #region 抽象工厂模式
            Creator _creatorA = new ConcreteCreatorA();
            _creatorA.CreateProductA();
            _creatorA.CreateProductB();

            Creator _creatorB = new ConcreteCreatorB();
            _creatorB.CreateProductA();
            _creatorB.CreateProductB();
            #endregion

            Console.ReadLine();
        }  

抽象工厂模式除了具有工厂方法模式的做点外,主要就是可以在类的内部对产品族进行约束。所谓的产品族一般都有一定的联系,抽象工厂模式就可以

在类内部对产品族的关联关系进行描述,而不必专门引入一个新的类来进行管理。抽象模式最大的缺点就是产品族的扩展,如果要加一个新的产品,差不多所有

的工厂类都需要进行修改,所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。

这们来说一个抽象工厂模式和工厂模式的区别:

我们看一下抽象模式的类图:设计模式:工厂方法模式

工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 区别: 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-02-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档