package com.mozq.base; /** * 抽象工厂:提供一个创建一系列相关对象的接口,而不是指定它们具体的类。 * 1.抽象工厂 * 2.抽象产品 * 3.具体产品 * 4.具体工厂 * 5.客户端使用某系列产品 * 使用步骤: * 1.工厂后于产品。//工厂就是生产产品的,产品都没有设计好,无法定义工厂的功能。 * 2.具体后于抽象。 * 必须先定义抽象产品,才能定义生产该抽象产品的抽象工厂。 * 必须先定义具体产品,才能定义生产该具体产品的具体工厂。
与其他模式关系:
因为具体工厂通常只需要一个,所以可以使用单例模式来实现。
关键点:
一系列相关的产品是理解抽象工厂的关键。
比方:(鼠标,键盘)是一个系列产品。
鼠标有华为鼠标,雷蛇鼠标,三星鼠标
键盘有小米键盘,华为键盘。
(华为鼠标,华为键盘)就是一个系列。客户端按照系列消费对象。而不是单个消费鼠标或者键盘。
另一种说法:
把(鼠标,键盘)看成一套产品,客户端则按套消费产品。
多种类相关的产品,可以和日常生活中的三件套作比较。(枕套,被套,床单)。
我们按照套来操作和修改。
优缺点: 一套产品,产品种类的增删很难。但实现具体产品的不同组合很容易。
* @author jie * */ /* * 1.先定义抽象产品,后定义生产该产品的抽象工厂 */ abstract class Door{ abstract void show(); } abstract class Window{ abstract void show(); } abstract class Style{ abstract Door createDoor(); abstract Door createWindow(); } /* * 2.先定义具体产品,后定义生产该产品的具体工厂 */ class DoorA extends Door{ @Override void show() { System.out.println("复古风格Door"); } } class DoorB extends Door{ @Override void show() { System.out.println("时尚风格Door"); } } class WindowA extends Door{ @Override void show() { System.out.println("复古风格Window"); } } class WindowB extends Door{ @Override void show() { System.out.println("时尚风格Window"); } } //创建具体工厂,生产一系列相关产品。 class FuGuSytle extends Style{ @Override Door createDoor() { return new DoorA(); } @Override Door createWindow() { return new WindowA(); } } class FashionSytle extends Style{ @Override Door createDoor() { return new DoorB(); } @Override Door createWindow() { return new WindowB(); } } public class AbstractFactoryDemo { public static void main(String[] args) { //客户端可以轻易地切换产品系列。 Style style = new FashionSytle(); style.createDoor().show(); style.createWindow().show(); } }