设计模式-抽象工厂模式(C#)

设计模式——抽象工厂模式(JAVA)

在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构。当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构、属于不同类型的具体产品时就可以使用抽象工厂模式。

抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建,当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、更有效率。

抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,而是负责创建一组产品。

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

一、抽象工厂模式的结构

在抽象工厂模式张,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品,这些产品构成一个产品族。

抽象工厂模式包含以下4个角色:

(1)AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。

(2)ConcreteFactory(具体工厂):它实现了抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。

(3)AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。

(4)ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,它实现抽象产品接口中声明的业务方法。

二、抽象工厂模式的实现

在抽象工厂中声明了多个工厂方法,用于创建不同类型的产品,抽象工厂可以是接口,也可以是抽象类或具体类。

abstract class AbstractFactory

{

public abstract AbstractProduct CreateProduct();    //工厂方法

......

}

具体工厂实现了抽象工厂,每一个具体的工厂方法创建一个特定的产品对象,而同一个具体工厂所创建的产品对象构成了一个产品族。对于每一个具体工厂类:

class ConcreteFactory : AbstractFactory

{

//工厂方法

public override AbstractProduct CreateProduct()

{

return new ConcreteProduct();

}

......

}

与工厂方法模式一样,抽象工厂模式也可以为每一种产品提供一组重载的工厂方法,以不同的方式来创建产品对象。

三、抽象工厂模式的应用

在上面的类图中,两厢车和三厢车称为两个不同的等级结构;而2.0排量车和2.4排量车则称为两个不同的产品族。再具体一点,2.0排量两厢车和2.4排量两厢车属于同一个等级结构,2.0排量三厢车和2.4排量三厢车属于另一个等级结构;而2.0排量两厢车和2.0排量三厢车属于同一个产品族,2.4排量两厢车和2.4排量三厢车属于另一个产品族。

明白了等级结构和产品族的概念,就理解工厂方法模式和抽象工厂模式的区别了,如果工厂的产品全部属于同一个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式。在本例中,如果一个工厂模式提供2.0排量两厢车和2.4排量两厢车,那么他属于工厂方法模式了如果一个工厂模式提供2.4排量两厢车和2.4排量三厢车两个产品,那么这个工厂模式就是抽象工厂模式,因为他提供的产品是分属两个不同的等级结构。当然,如果一个工厂提供全部四种车型的产品,因为产品分属两个等级结构,他当然也属于抽象工厂模式了。

抽象工厂模式代码:

package AbstractFactoryModel;

interface IProduct1 {

public void show();

}

interface IProduct2{

public void show();

}

class Product1 implements IProduct1{

public void show(){

System.out.println("这是1型产品");

}

}

class Product2 implements IProduct2{

public void show(){

System.out.println("这是2型产品");

}

}

interface IFactory{

public IProduct1 createProduct1();

public IProduct2 createProduct2();

}

class Factory implements IFactory{

public IProduct1 createProduct1(){

return new Product1();

}

public IProduct2 createProduct2(){

return new Product2();

}

}

客户端代码:

package AbstractFactoryModel;

public class Client {

public static void main(String[] args) {

// TODO Auto-generated method stub

IFactory factory=new Factory();

factory.createProduct1().show();

factory.createProduct2().show();

}

}

四、抽象工厂模式的优缺点

优点:

(1)隔离了具体类的生成,使得客户端并不需要知道什么被创建。只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

(2)当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族。

(3)增加新产品族很方便,无须修改已有系统,符合开闭原则

缺点:

增加新的产品等级结构麻烦,需要对原有系统进行较大规模的修改,甚至需要修改抽象层代码,这显然会带来很大的不便,违背了开闭原则。

五、使用场景

(1)一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是很重要的,用户无须关心对象的创建过程,将对象的创建和使用解耦。

(2)系统中有多于一个的产品族,但每次只使用其中某一产品族,可以通过配置文件等方式使用户能够动态地改变产品族,也可以很方便地增加新的产品族。

(3)属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。同一个产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束,如同一操作系统下的按钮和文件框,按钮和文件框之间没有直接的关系,但它们都是属于某一操作系统的。此时具有一个共同的约束条件:操作系统的类型。

(4)产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。

时间: 11-21

设计模式-抽象工厂模式(C#)的相关文章

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

要想正确的理解设计模式,首先必须明确它是为了解决什么问题而提出来的. 抽象工厂设计模式概念: 针对抽象工厂这个设计模式,我查找了不少资料,感觉只有涉及产品级别和产品族的才是理解了抽象工厂设计模式的精髓,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.有些观点认为抽象工厂模式是为了解决客户端代码与工厂类的耦合问题,我认为这种观点的解决方案只是简单工厂模式的一个应用,而这种观点认为的抽象工厂模式是: 工厂模式+简单工厂模式=抽象工厂模式,这是不正确. 针对的问题: 针对

JAVA设计模式--抽象工厂模式

抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关的代码.由应用程序调用以创建对应的具体产品的对象.在java中它由具体的类来实现.抽象产品角色:它是具体产品继承的父类或者是实现的接口.在java中一般

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

抽象工厂模式(Abstract Factory Pattern)是属于创建型的设计模式,意在创造一个抽象的工厂,而后再由实例化出的具体的工厂来进行生产. 何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品. 应用实例:工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品).时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装.商务男装.时尚女装.时尚男装,这些也都是成套的,即一系列具体产品.假设一种情况(现实中是不存在的,要不然

24种设计模式--抽象工厂模式【Abstract Factory Pattern】

女娲造人,人是造出来了,世界是热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类重新洗牌,准备重新开始制造人类. 由于先前的工作已经花费了很大的精力做为铺垫,也不想从头开始了,那先说人类(Product 产品类)怎么改吧,好,有了,给每个人类都加一个性别,然后再重新制造,这个问题解决了,那八卦炉怎么办?只有一个呀,要么生产出全都是男性,要不都是女性,那不行呀,有了,把已经有了一

Java与设计模式-抽象工厂模式

首先说明,文章较长,保证你有耐心看完肯定能懂,没耐心直接点×即可. 抽象工厂模式,是创建型设计模式之一.抽象型工厂模式适合产品确定,产品线不确定的类型,怎么讲?通过一个具体例子来讲一下吧.例如某电脑厂商要生产电脑,也就是电脑这个产品确定,而电脑配置不确定,这种情况可以用抽象工厂模式来解决.类图如图所示: 代码实现完全结合UML类图,结合图就可以完成系统创建. 本实例里是抽象类ComputerFactory(对应UML类图中的AbstractFactory): package com.factor

设计模式:抽象工厂模式

原文地址:http://leihuang.org/2014/12/03/abstract-factory/ Creational 模式 物件的产生需要消耗系统资源,所以如何有效率的产生.管理 与操作物件,一直都是值得讨论的课题, Creational 模式即与物件的建立相关,在这个分类下的模式给出了一些指导原则及设计的方向.下面列举到的全属于Creational 模式 Simple Factory 模式 Abstract Factory 模式 Builder 模式 Factory Method

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

一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性.但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,这是本专题所要介绍的内容. 二.抽象工厂详细介绍

c++设计模式-----抽象工厂模式

抽象工厂模式 要创建一组相关或者相互依赖的对象 作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. UML类图 抽象基类: 1)AbstractProductA.AbstractProductB:分别代表两种不同类型的产品,由具体的产品派生类对其实现 2)AbstractFactory:抽象工厂类,提供创建两种产品的接口CreateProductA和CreateProductB,由派生的各个具体工厂类对其实现 说明: AbstractFactory模式关键就是将这一组对象

javascript设计模式-抽象工厂模式

抽象工厂模式,是创建型模式的一种,其实是一个实现子类继承父类的方法,在这个方法中,通过传递子类以及要继承父类的名称,并且在抽象工厂方法中增加了对抽象类存在性的判断,如果存在,则将子类继承父类的方法.然后子类通过寄生式继承. 抽象工厂是用来创建子类的,本身可以视为一个类簇,它制定了子类的结构,让子类继承抽象工厂的方法及属性,因此抽象工厂模式可以创建多类对象. 例:定义抽象工厂方法: var VehicleFactory = function (subFun, subClass) { if (typ