zoukankan      html  css  js  c++  java
  • 设计模式—— 九 :抽象工厂模式


    @


    什么是抽象工厂模式?


    抽象工厂模式(Abstract Factory Pattern)是一种比较常用的模式,其定义如下:

    Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们 的具体类。)

    抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象 工厂模式产生需要的对象是一种非常好的解决方式。和工厂方法模式相比,抽象工厂模式中 的具体工厂不只是创建一种产品,它负责创建一族产品。

    抽象工厂模式的通用类图如图9-1所示:

    图9-1:抽象工厂模式通用类图

    在这里插入图片描述

    抽象工厂模式通用类图中包含几个角色:

    • AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一 种产品。
    • AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一 种产品。
    • AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的 业务方法。
    • ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中 声明的业务方法。

    来看一下抽象工厂模式的具体代码,首先有两个互相影响的产品线(也叫做产品族),例如制造汽车的左侧门和右侧门,这两个应该是数量相等的——两个对象之间的约束,每个型号的车门都是不一样的,这是产品等级结 构约束的,我们先看看两个产品族的类图,如图9-2所示:

    图9-2:抽象工厂模式的通用源码类图

    在这里插入图片描述

    • 抽象产品类
    public abstract class AbstractProductA {
    	//每个产品共有的方法
    	public void shareMethod(){ 
    		
    	}
    	//每个产品相同方法,不同实现 
    	public abstract void doSomething();
    }
    
    

    • 产品A1的实现类
    public class ProductA1 extends AbstractProductA {
    	public void doSomething() {
    		System.out.println("产品A1的实现方法");
    	}
    }
    
    • 产品A2的实现类
    public class ProductA2 extends AbstractProductA {
    	public void doSomething() {
    		System.out.println("产品A2的实现方法");
    	}
    }
    

    抽象产品类B和B的实现类也是类似的。


    • 抽象工厂类
      抽象工厂类定义了两个产品族的产品创建,有N个产品族,就应该定义N个创建方法。
    public abstract class AbstractCreator { 
    	//创建A产品家族 
    	public abstract AbstractProductA createProductA(); 
    	//创建B产品家族 
    	public abstract AbstractProductB createProductB(); 
    }
    
    

    • 产品等级1的实现类:
    public class Creator1 extends AbstractCreator {
    	// 只生产产品等级为1的A产品
    	public AbstractProductA createProductA() {
    		return new ProductA1();
    	}
    
    	// 只生产产品等级为1的B产品
    	public AbstractProductB createProductB() {
    		return new ProductB1();
    	}
    }
    
    

    • 产品等级2的实现类
    public class Creator2 extends AbstractCreator {
    	// 只生产产品等级为2的A产品
    	public AbstractProductA createProductA() {
    		return new ProductA2();
    	}
    
    	// 只生产产品等级为2的B产品
    	public AbstractProductB createProductB() {
    		return new ProductB2();
    	}
    }
    

    有M个产品等级就应该有M个实现工厂类,在每个实现工厂中,实现不同产品族 的生产任务。


    • 场景类
      在场景类中,没有任何一个方法与实现类有关系,对于一个产品来说,我们只要知道它 的工厂方法就可以直接产生一个产品对象,无须关心它的实现类。
    public class Client {
    	public static void main(String[] args) {
    		// 定义出两个工厂
    		AbstractCreator creator1 = new Creator1();
    		AbstractCreator creator2 = new Creator2();
    		// 产生A1对象
    		AbstractProductA a1 = creator1.createProductA();
    		// 产生A2对象
    		AbstractProductA a2 = creator2.createProductA();
    		// 产生B1对象
    		AbstractProductB b1 = creator1.createProductB();
    		// 产生B2对象
    		AbstractProductB b2 = creator2.createProductB();
    		/** 然后在这里就可以为所欲为了... */
    	}
    }
    

    抽象工厂模式优缺点

    抽象工厂模式优点L

    • (1) 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离, 更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接 口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
    • (2) 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产 品族中的对象。
    • (3) 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。

    抽象工厂模式缺点:

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

    抽象工厂模式应用场景

    在以下情况下可以考虑使用抽象工厂模式:

    • (1) 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工 厂模式都是很重要的,用户无须关心对象的创建过程,将对象的创建和使用解耦。
    • (2) 系统中有多于一个的产品族,而每次只使用其中某一产品族。可以通过配置文件等方式来 使得用户可以动态改变产品族,也可以很方便地增加新的产品族。
    • (3) 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。同一个 产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束,如同一操作 系统下的按钮和文本框,按钮与文本框之间没有直接关系,但它们都是属于某一操作系统 的,此时具有一个共同的约束条件:操作系统的类型。
    • (4) 产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的 产品等级结构。

    参考:

    【1】:《设计模式之禅》
    【2】:《研磨设计模式》
    【3】:《Design-Pattern包教不包会(设计模式包教不包会)》
    【4】:《design parrern java》

  • 相关阅读:
    hdu 1290 献给杭电五十周年校庆的礼物 (DP)
    hdu 3123 GCC (数学)
    hdu 1207 汉诺塔II (DP)
    hdu 1267 下沙的沙子有几粒? (DP)
    hdu 1249 三角形 (DP)
    hdu 2132 An easy problem (递推)
    hdu 2139 Calculate the formula (递推)
    hdu 1284 钱币兑换问题 (DP)
    hdu 4151 The Special Number (DP)
    hdu 1143 Tri Tiling (DP)
  • 原文地址:https://www.cnblogs.com/three-fighter/p/12548343.html
Copyright © 2011-2022 走看看