深入浅出设计模式 ------ Abstract Factory(抽象工厂)

一. 定义
 提供一个创建一系列相关或相互依赖对象的接口, 而无需指定它们的具体类。

二. 结构

三. 参与者

Product (Fruit和Leaf两个抽象产物) : 抽象生产者接口;

TreeFruit(树上的水果)、 TreeLeaf(树上的叶子)、 GroundFruit(地上的水果)、 GroundLeaf(地上的叶子) : 实际的自然产物;

NatureFactory: 抽象的自然制造工厂, 用于生产水果和叶子;

TreeFactory、 LeafFactory : 实际的自然制造工厂, 用于生产树上或地上的水果和叶子。

四. 适用性 

- 一个系统独立(解耦)于它的产品的创建、 组合和表示时

- 一个系统要由多个它的产品的创建、组合(以上的自然界需要水果和叶子的组合)和表示时

- 强调一系列相关的产品对象的设计以便进行联合使用时

- 提供一个产品库, 而只想显示接口(面向接口编程)而不是实现时。

五. 具体实现

抽象工厂: 制造大自然中的叶子和水果

package com.wenniuwuren.abstractfactory;
/**
 * 抽象工厂: 制造大自然中的叶子和水果
 * @author wenniuwuren
 *
 */
public interface NatureFactory {

	public Fruit createFruit();

	public Leaf createLeaf();
}

工厂实现类: 制造地面上的叶子和水果

package com.wenniuwuren.abstractfactory;

/**
 * 工厂实现类: 制造地面上的叶子和水果
 * @author wenniuwuren
 *
 */

public class GroundFactory implements NatureFactory {

	@Override
	public Fruit createFruit() {
		return new GroundFruit();
	}

	@Override
	public Leaf createLeaf() {
		return new GroundLeaf();
	}

}

工厂实现类:制造树上的水果和叶子

package com.wenniuwuren.abstractfactory;

/**
 * 工厂实现类:制造树上的水果和叶子
 * @author wenniuwuren
 *
 */
public class TreeFactory implements NatureFactory {

	@Override
	public Fruit createFruit() {
		return new TreeFruit();
	}

	@Override
	public Leaf createLeaf() {
		return new TreeLeaf();
	}

}

水果接口:

package com.wenniuwuren.abstractfactory;

/**
 * 水果接口
 * @author wenniuwuren
 *
 */
public interface Fruit {
  public String product();
}

水果实现类:地上的水果

package com.wenniuwuren.abstractfactory;

/**
 * 水果实现类:地上的水果
 * @author wenniuwuren
 *
 */
public class GroundFruit implements Fruit {

	@Override
	public String product() {
		return "GroundFruit";
	}

}

水果实现类: 树上的水果

package com.wenniuwuren.abstractfactory;

/**
 * 水果实现类: 树上的水果
 * @author wenniuwuren
 *
 */
public class TreeFruit implements Fruit {

	@Override
	public String product() {
		return "TreeFruit";
	}

}

叶子接口:

package com.wenniuwuren.abstractfactory;

/**
 * 叶子接口
 * @author wenniuwuren
 *
 */
public interface Leaf {
	public String product();
}

叶子实现类: 地上的叶子

package com.wenniuwuren.abstractfactory;

/**
 * 叶子实现类: 地上的叶子
 * @author wenniuwuren
 *
 */
public class GroundLeaf implements Leaf {

	@Override
	public String product() {
		return "GroundLeaf";
	}

}

叶子实现类:树上的叶子

package com.wenniuwuren.abstractfactory;

/**
 * 叶子实现类:树上的叶子
 * @author wenniuwuren
 *
 */
public class TreeLeaf implements Leaf {

	@Override
	public String product() {
		return "TreeLeaf";
	}

}

测试类:Client

package com.wenniuwuren.abstractfactory;

public class Client {

	public static void main(String[] args) {

		// 生产树上的水果
		//Fruit fruit = new TreeFruit(); //没用抽象工厂时的调用方法
		NatureFactory natureFactory = new TreeFactory();
		Fruit fruit = natureFactory.createFruit();
		System.out.println(fruit.product()); 

		// 生产树上的叶子
		Leaf leaf = natureFactory.createLeaf();
		System.out.println(leaf.product());

		// 生产地上的水果
		natureFactory = new GroundFactory();
		fruit = natureFactory.createFruit();
		System.out.println(fruit.product()); 

		// 生产地上的叶子
		leaf = natureFactory.createLeaf();
		System.out.println(leaf.product());
	}
}

测试结果:

TreeFruit

TreeLeaf

GroundFruit

GroundLeaf

本文可以和笔者的深入浅出设计模式 ------ Factory Method(工厂方法)参照着看, 可以区分这三个工厂模式的不同。

参考书籍:

《设计模式 : 可复用面向对象软件的基础》

《Effective Java》

《Head First 设计模式》

时间: 2024-10-09 23:04:34

深入浅出设计模式 ------ Abstract Factory(抽象工厂)的相关文章

一天一个设计模式——Abstract Factory抽象工厂模式

一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂方法模式中,抽象工厂使用抽象的零件组装成抽象的产品.即使用包含特定的方法接口零件,将零件组装成抽象产品. 二.模式类图: 上面的类图中包含两个包:包含抽象工厂,抽象零件,抽象产品的类所在的包以及具体工厂实现类的包. 三.代码示例 1.Item类: package com.designpattern.

设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要强调一系列相关的产品对象的设计以便进行联合使用. 4.当你提供一个产品类库,而只想显示它们的接口而不是实现. 3.评价 1.它分离了具体的类 2.它使得易于交换产品系列 3.它有利于产品的一致性 4.难以支持新种类的产品 5."开放-封闭"原则要求系统对扩展开放,对修改封闭.通过扩展达到增

c++ 设计模式9 (Abstract Factory 抽象工厂模式)

5.2 抽象工厂模式 动机:在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 代码示例: 实现利用数据库的业务逻辑,支持多数据库(Sql,Oracle等),有连接.命令.读取等功能. 其中命令,连接功能之间有相互联系. 方法一(使用工厂方法): 每个功能类有一个创建的工厂,如IDBConnection与IDBConnectionFactory 1 //数据库访问有关的基类 2 class IDBConnection{ 3

Java设计模式:Abstract Factory(抽象工厂)模式

概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品),而系统只消费其中某一族的产品.换句话说,抽象工厂创建一整套具有相互依赖或作用关系的产品(至少两个产品),而工厂方法中的工厂只能创建单一系列的产品. 应用场景 客户端不需要知道它所创建的对象的类. 需要一组对象共同完成某种功能时,并且可能存在多组对象完成不同功能的情况. 系统结构稳定,不会频繁地增加

Abstract Factory 抽象工厂模式

提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具体实现,创建一组具体的对象. 以下情况可以使用抽象工厂模式: 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关的产品对象的设计以便进行联合使用时. 当你提供一个产品类库,而只想显示它们的接口而不是实现时. 抽象工厂模式的优缺点: 他分离

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

1.动机与定义 工厂模式中,一个工厂仅仅能提供一个或一类产品,当产品种类较多,形成产品系列(比方我们要创建跨平台的button,菜单,文本框等等一系列GUI控件: 单纯使用工厂模式会产生大量工厂,并且后期维护也不方便,我们能够从产品中找到规律,假设产品等级相对固定,以后仅仅会新增产品族,那么我们就能够把整个产品族放到一个工厂创建,以后新增其它系统产品族也很方便,例如以下图: 这样的模式就是抽象工厂,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则须要面对多个产品等级结构,一个工厂等级结构能

设计模式C++实现——抽象工厂模式

模式定义: 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道实际产出的具体产品时什么.这样一来,客户就从具体的产品中被解耦了. 模式结构: 举例: 数据库访问程序设计,不同的数据库访问方式可能不一样,为了抽象对对不同数据库的访问,可以将数据库隐藏起来,提供统一的访问方式,用多态进行实现. UML设计: 编程实现及执行结果: #include <iostream> using namespace st

【java设计模式】之 抽象工厂(Abstract Factory)模式

1. 女娲的失误 上一节学习了工厂模式,女娲运用了该模式成功创建了三个人种,可是问题来了,她发现没有性别--这失误也忒大了点吧--竟然没有性别,那岂不是--无奈,只好抹掉重来了,于是所有人都被消灭掉了,重新造人. 女娲开始分析了,既然要区别男女,那么生产人种的工厂(八卦炉)要重新改造了,因为一个设备要么全男性,要么全女性.所以只能将八卦炉拆开了,把原先的一个变两个,并且略加修改,变成女性八卦炉和男性八卦炉,这样就可以了.于是女娲开始准备生产了,她先画了个示意图如下: 这个图虽然有点大,但是不复杂

java设计模式之二抽象工厂模式(Abstract Factory)

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码.因为抽象工厂不太好理解,我们先看看图,然后就和代码,就比较容易理解. 1 package com.qcf.test2; 2 /** 3 * 抽象工厂模式 4 * 为方法创建一个接口 5 * 为工厂类创建一个接口 6 * 如果再