博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式:抽象工厂方法模式
阅读量:7098 次
发布时间:2019-06-28

本文共 2820 字,大约阅读时间需要 9 分钟。

之前写的模式帖子:

 

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

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

我之前说过,我们最后会做一下两种模式的区别

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

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

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

我们来看一下代码

#region 抽象工厂模式    #region 产品    #region 产品A    ///     /// 抽象产品A    ///     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    ///     /// 抽象产品B    ///     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();        }  

 

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

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

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

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

我们看一下抽象模式的类图:

工厂方法模式:

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

 

转载地址:http://rghql.baihongyu.com/

你可能感兴趣的文章
【Spark Summit East 2017】使用Spark横向扩展关系型数据库
查看>>
远程桌面RemoteDesktopManager使用教程
查看>>
根据输入的byte单位计算出最简洁的表示数据
查看>>
Android SDK更新失败及其解决办法
查看>>
深一层看依赖注入
查看>>
linux 禁止指定ip访问
查看>>
【原创】erlang 模块之 os
查看>>
Http Session和Cookie
查看>>
层次分析法
查看>>
使用Hive处理服务器日志
查看>>
一道面试题: 预处理器标识#error的目的是什么?
查看>>
工厂设计模式 Factory
查看>>
抛弃NVelocity,来玩玩Razor
查看>>
Silverlight 5 RC新特性探索系列:13.Silverlight 5 RC 新增对并行任务库(TPL)的支持
查看>>
Java线程池架构(二)多线程调度器
查看>>
多线程执行顺序诡异现象谈,你不知道的pthread_create
查看>>
【shell 脚本】算术测试需要使用(( ))
查看>>
【项目总结】自然语言处理在现实生活中运用
查看>>
原子循环计数器
查看>>
十四个方法提高博客的页面访问量
查看>>