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();
}
}