浅析JAVA设计模式之工厂模式(三)

在阅读本文之前,请先阅读(一)和(二)中的简单工厂模式和工厂方法模式。

1抽象工厂模式简介

抽象工厂 (Abstract Factroy)
模式:工具箱模式(kit)。抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态,如下图。

图1.1

上图左边有一个工厂类的等级结构,右边有两个不同的产品等级结构,分别是产品A的等级结构和产品B的等级结构,工厂1和工厂2分别负责不同一个产品等级,同一个产品族的产品的生产。又例如下图:

图1.2

上图表示的是Button和Text两个不同产品的等级结构,同时有两个产品族,而UnixButton和UnixText是属于Unix产品族,WinButton和WinText是属于Windows产品族。其相图如下:

图1.3

虽然有多个产品等级结构,但是只需要一个工厂等级结构就可以生产多个等级结构的产品,上面的例子,就只需要两个具体子工厂,UnixFactory和WinFactory,UnixFactory对象负责创建Unix产品族中的产品,WinFactory对象负责创建Win产品族中的产品。这就是抽象工厂的典型的一个应用。UML图如下:

图1.4

上面2个不同等级结构的产品Button和Text具有平行的结构,因此,如果采用工厂方法模式,必须要使用两个独立的工厂等级结构来应对这2种产品等级结构,如采用工厂方法则如下图:

图1.5

由于这2个产品等级结构的相似性,会导致2个平行的工厂等级结构,随着产品等级结构的增加,工厂方法模式所给出的工厂等级结构的数目也会随之增加。

所以,用抽象工厂模式的好处就是同一个工厂等级结构负责多个不同产品等级结构中的产品对象的创建,如上面的图1.4,一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族的所有对象,显然,这时候抽象工厂比工厂方法更加有效率。

所以抽象工厂模式和工厂方法模式的最大区别在于,工厂方法模式是针对一个产品等级结构,工厂方法模式则需要面对多个产品等级结构。

1.1抽象工厂模式(工具箱模式模式):

抽象工厂模式有三个角色: 1. 抽象产品接口2. 具体产品类 3. 抽象工厂接口 4.具体工厂类。

1.2抽象工厂的实现(建一个abstractFactory包,所有程序都放在该包下):

(1)首先建一个抽象产品接口(Pc.java)。

package abstractFactory;
public interface Pc {
	public void run();
}

(2)建两个具体产品类(DellPc.java、LenovoPc.java),需要实现Pc接口。

package abstractFactory;
public class DellPc implements Pc {
	public void run() {
		System.out.println("戴尔PC运行");
	}
}

package abstractFactory;
public class LenovoPc implements Pc {
	public void run() {
		System.out.println("联想PC运行");
	}
}

(3)再建一个抽象产品接口(Notebook.java)。

package abstractFactory;
public interface Notebook {
	public void run();
}

(4)建两个具体产品类(DellNotebook.java、LenovoNotebook.java),实现Lenovo接口。

package abstractFactory;
public class DellNotebook implements Notebook {
	public void run() {
		System.out.println("戴尔笔记本电脑运行");
	}
}

package abstractFactory;
public class LenovoNotebook implements Notebook {
	public void run() {
		System.out.println("联想笔记本电脑运行");
	}
}

(5)建一个抽象工厂接口(ComputerFactory.java),添加两个工厂方法makePc()、makeNotebook(),也可以采用空接口。

package abstractFactory;
public interface ComputerFactory {
public Pc makePc();
public Notebook makeNotebook();
}

(6)建两个个具体工厂类(DellComputerFactory.java、LenovoComputerFactory.java)。

package abstractFactory;
public class DellComputerFactory implements ComputerFactory {
	public DellPc makePc(){
		return new DellPc();
	}
	public DellNotebook makeNotebook(){
		return new DellNotebook();
}
}
package abstractFactory;
public class LenovoComputerFactory implements ComputerFactory {
	public LenovoPc makePc(){
		return new LenovoPc();
	}
	public LenovoNotebook makeNotebook(){
		return new LenovoNotebook();
}
}

(7)建一个客户端程序(TestAbstractFactory.java)测试。

package abstractFactory;
public class TestAbstractFactory {
public static void main(String []args)throws Exception{
ComputerFactory computerFactory=new  DellComputerFactory();
Pc dellpc1=computerFactory.makePc();
Notebook dellnotebook1=computerFactory.makeNotebook();
dellpc1.run();
dellnotebook1.run();
}
}

运行输出:

戴尔PC运行

戴尔笔记本电脑运行

运行成功,上面看出一个具体工厂对象负责两个不同产品等级结构但同属于一个产品族的产品的生产。

一般来说,有多少个产品等级结构,在每个具体工厂角色中就有多少个工厂方法,每一个产品等级结构中有多少个具体产品,就有多少个产品族,在工厂等级结构中就会有多少个具体工厂角色。

我们的例子中,有2个产品等级结构(Pc和Notebook),所以每个具体工厂(DellComputerFactory和 LenovoComputerFactory)就会有两个工厂方法(makePc()、makeNotebook())。

而每个产品等级结构中刚好有2个具体产品,所以就有2个产品族(Dell的Pc和Notebook一族,Lenovo的Pc和Notebook一族),所以在工厂等级结构中有两个具体工厂角色(DellComputerFactory和LenovoComputerFactory)。如图1.6

图1.6

(7)最后,我们再看一下抽象工厂模式的UML图,如图1.7。

图1.7

推荐文章:

浅析JAVA设计模式之工厂模式(二)

http://blog.csdn.net/minidrupal/article/details/38323457

浅析JAVA设计模式之工厂模式(一)

http://blog.csdn.net/minidrupal/article/details/38323341

Author: Vicky

Introduction: 教育工作者

Sign: 前事不忘,后事之师

时间: 11-12

浅析JAVA设计模式之工厂模式(三)的相关文章

浅析JAVA设计模式之工厂模式(一)

1 工厂模式简介 工厂模式的定义:简单地说,用来实例化对象,代替new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式可以动态决定将哪一个类实例化,不用先知道每次要实例化哪一个类. 工厂模式可以分一下三种形态: 简单工厂 (Simple Factory)模式:又称静态工厂模式(StaticFactory). 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory). 抽象工厂 (Abstract Factroy)模式:又称工具箱模式

浅析JAVA设计模式之工厂模式(二)

1 工厂方法模式简介 工厂方法 (Factroy Method) 模式:又称多态性工厂模式(Polymorphic Factory),在这种模式中,核心工厂不再是一个具体的类,而是一个抽象工厂,提供具体工厂实现的接口,具体创建产品交由子工厂去做,抽象工厂不涉及任何产品被实例化的细节.而不同等级的产品,就对应一个不同等级的工厂,如下图. 图1 1.1工厂方法模式(多态性工厂模式): 工厂方法模式有三个角色: 1. 抽象产品接口 2. 具体产品类 3. 抽象工厂接口 4.具体工厂类. 1.2工厂方法

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实

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

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

java设计模式--简单工厂模式

 简单工厂设计模式 工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式.它定义一个用于创建对象的接口,由子类决定实例化哪一个类. 核心知识点如下: (1) 大量共同定义的接口. (2) 由不同的对象去实现该接口. (3) 子类(具体工厂类)决定实例化哪一个类(具体产品类)有着“一对一”的关系. 前言(也算是工厂的一个应用需求场景吧) 最近在构建自动化测试平台,公司需求是:必须在IE,火狐,Google浏览器下回归测试用例.Selenium的webdriv

JAVA设计模式之工厂模式

以下代码仅供展示工厂模式,不能直接编译,因为一个文件中最多只能有一个public class. 一.简单工厂模式:比较简单,produceProduct方法最好是静态的.它是根据参数来决定返回哪一种类型的product. 1 public interface Product 2 { 3 public void getName(); 4 } 5 6 public class ProductA implements Product 7 { 8 public void getName() 9 { 10

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

工厂模式有三种:简单工厂.工厂方法.抽象工厂 一. 抽象工厂 1. 一个可以生产多种产品的工厂: 2. 不改变工厂无法生产新的产品. package com.coshaho.learn.factory; public class SimpleFactory { // 绝对值告警 public class AbsoluteAlarm {} // 历史值告警 public class HistoryAlarm {} // 简单工厂 public class AlarmFactory { public

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

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

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

1.    简单工厂模式 1.1 概述 又叫静态工厂方法模式,它定义一个具体的工厂类负责创建一些类的实例. 1.2 优点 客户端不需要在负责对象的创建,从而明确了各个类的职责. 1.3 缺点 这个静态工厂类负责所有对象的创建,如果有新的对象增加,或者某些对象的创建方式不同,就需要不断的修改工厂类,不利于后期的维护 2.     代码 Animal抽象类-Animal.java package cn.itcast_01; public abstract class Animal { public