设计模式 创建型 抽象工厂

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(); } }
原文地址:https://www.cnblogs.com/mozq/p/10438304.html