在阅读本文之前,请先阅读(一)和(二)中的简单工厂模式和工厂方法模式。
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: 前事不忘,后事之师