`
20386053
  • 浏览: 432200 次
文章分类
社区版块
存档分类
最新评论

设计模式之3——抽象工厂模式

 
阅读更多

动机
在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。

简介
抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。——GOF

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏代换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。

结构


构成
AbstractFactory:抽象工厂接口,它里面应该包含所有的产品创建的抽象方法。
ConcreteFactory1/ConcreteFactory2:具体的工厂,创建具有特定实现的产品对象。
AbstractProductA/AbstractProductB:抽象产品,它们都有可能有两种不同的实现。
ProductA1/ProductA2/ProductB1/ProductB2:对两个抽象产品的具体分类的实现。

代码
测试程序:

class Program
{
    static void Main(string[] args)
    {
            AbstractFactory factory1 = new ConCreateFactory1();
	        Client c1 = new Client(factory1);
	        c1.Run();
	        AbstractFactory factory2 = new ConCreateFactory2();
	        Client c2 = new Client(factory2);
	        c2.Run();
	        Console.Read();
    }
}


抽象工厂:AbstractFactory

abstract class AbstractFactory
{
	public abstract AbstractProductA CreateProductA();
	public abstract AbstractProductB CreateProductB();
}


具体工厂1:ConCreateFactory1

class ConCreateFactory1 : AbstractFactory
{
	public override AbstractProductA CreateProductA()
    {
	    return new ProductA1();
	}
	public override AbstractProductB CreateProductB()
	{
	    return new ProductB1();
	}
}


具体工厂2:ConCreateFactory2

class ConCreateFactory2 : AbstractFactory
{
	public override AbstractProductA CreateProductA()
	{
	    return new ProductA2();
	}
	public override AbstractProductB CreateProductB()
	{
	    return new ProductB2();
	}
}


抽象产品A:AbstractProductA

abstract class AbstractProductA
{
	       
}


抽象产品B:AbstractProductB

abstract class AbstractProductB
{
	public abstract void Interact(AbstractProductA a);
}


具体产品ProductA1

class ProductA1 : AbstractProductA
{
	       
}


具体产品ProductA2

class ProductA2 : AbstractProductA
{
	       
}


具体产品ProductB1

class ProductB1 : AbstractProductB
{
	public override void Interact(AbstractProductA a)
	{
	    Console.WriteLine(this.GetType().Name+"interacts with"+a.GetType().Name);
	}
}


具体产品ProductB2

class ProductB2 : AbstractProductB
{
	public override void Interact(AbstractProductA a)
	{
	    Console.WriteLine(this.GetType().Name+"interacts with"+a.GetType().Name);
	}
}


客户端,使用环境

class Client
{
	private AbstractProductA AbstractProductA;
	private AbstractProductB AbstractProductB;
    public Client(AbstractFactory factory)  //构造,注意通过构造传入抽象工厂
	{
	    AbstractProductB = factory.CreateProductB();
	    AbstractProductA = factory.CreateProductA();
	}
	public void Run()
	{
	    AbstractProductB.Interact(AbstractProductA);
	}
}


总结
优点

1.易于交换产品系统,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。
2.它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
缺点
最大的缺点就是产品族扩展非常困难。如要增加一个产品C,也就是说有产品家族由原来的2个,增加到3个,抽象类AbstractCreator要增加一个方法createProductC(),然后,两个实现类都要修改——严重违反了开闭原则。
注意
在抽象工厂模式的缺点中,我们提到抽象工厂模式的产品族扩展比较困难,但是一定要清楚是产品族扩展困难,而不是产品等级,在该模式下,产品等级是非常容易扩展的,增加一个产品等级,只要增加一个工厂类负责新增加出来的产品生产任务即可,也就是说横向扩展容易,纵向扩展困难。
适用性
1.一个系统要独立于它的产品的创建、组合和表示时。
2.一个系统要由多个产品系统中的一个来配置时。
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4.当你提供一个产品类库,只想显示它们的接口不是实现时。

分享到:
评论

相关推荐

    设计模式——抽象工厂模式

    设计模式——抽象工厂模式源码,设计模式——抽象工厂模式源码

    软件设计模式——抽象工厂

    vs2010实现的软件设计模式——抽象工厂,是软件工程专业学生专业技能之一

    设计模式实现——抽象工厂模式结构实现

    写博客上传的代码:blog http://blog.csdn.net/t1234xy4/article/details/52424048

    Android之大话设计模式——:抽象工厂模式借鉴.pdf

    Android之大话设计模式——:抽象工厂模式借鉴.pdf

    Android之大话设计模式——:抽象工厂模式参考.pdf

    Android之大话设计模式——:抽象工厂模式参考.pdf

    格斗类游戏软件——抽象工厂模式

    现在需要设计一款格斗类游戏软件,为了适应不同等级玩家的需要,游戏特地安排了三个难度级别: ①初等级别:敌方士兵反应迟钝,怪兽步履缓慢,即便是初学者也能够很轻松地取胜; ②中间级别:敌方士兵反应适度,怪兽...

    SETema5:软件设计模式——抽象工厂

    SETema5 软件设计模式——抽象工厂

    Python设计模式之抽象工厂模式原理与用法详解

    本文实例讲述了Python设计模式之抽象工厂模式原理与用法。...设计模式——抽象工厂模式 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类 import sys #抽

    java23种设计模式——图解——附带源码

    java23种设计模式 工厂模式 ,抽象工厂,建造者模式,单态模式,原型模式

    C#抽象工厂实例,设计模式

    抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户...

    (创建模式 上)设计模式——工厂、抽象工厂 C++/Python3实现

    简介 设计模式是为了解决一些出现的问题设计的解决方案。是长时间经验的总结,是根据...工厂模式 在类中实现一个接口创建指定对象,使一个类的实例化延迟到了子类。简单来说把类的创建都封装起来,只需要调用一个子类

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...

    深入浅出设计模式四——多区域比萨加盟店生产比萨实现(抽象工厂模式)

    NULL 博文链接:https://quicker.iteye.com/blog/608844

    C++设计模式原理与实战视频课

    2-8 抽象工厂的实用工程技术——抽象工厂的使用场景 2-9 构建者模式Builder的定义、场景与实现 2-10 构建者模式的实用工程技术——代码的坏味道:算法与对象构建的隔离 2-11 原型模式的定义场景与实现——对象的快速...

    抽象工厂模式 源代码

    ——探索设计模式系列之三 Terrylee,2005年12月12日 概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过...

    Java设计模式 版本2

    Java设计模式,目录:前言,UML建模技术,深入浅出UML类图,从招式与内功谈起——设计模式概述,面向对象设计原则,工厂三兄弟之简单工厂模式,工厂三兄弟之工厂方法模式,工厂三兄弟之抽象工厂模式,确保对象的唯一...

    设计模式可复用面向对象软件的基础.zip

    3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 3.4 Prototype(原型)—对象创建型 模式 87 3.5 ...

    java设计模式

    9.3.3 抽象工厂模式的使用场景 9.3.4 抽象工厂模式的注意事项 9.4 最佳实践 第10章 模板方法模式 10.1 辉煌工程—制造悍马 10.2 模板方法模式的定义 10.3 模板方法模式的应用 10.4 模板方法模式的扩展 10.5 最佳实践...

    Java设计模式——工厂设计模式

    抽象工厂模式 面向对象设计的基本原则: OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。 DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对...

    C++设计模式之抽象工厂模式

    之前讲到了C++设计模式——工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理;由于工厂方法模式创建的对象都是继承于Product的,所以工厂方法...

Global site tag (gtag.js) - Google Analytics