版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenbetter1996/article/details/88425815
个人整合学习自
- 《Java设计模式》 刘伟 编著
模式概述
抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形式。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品,而抽象工厂模式针对的是多个/一组产品,常见的用途是换皮肤(皮肤里面有很多组件,对应一组产品)
模式结构
- 抽象工厂:声明一组产品创建的方法,每一个方法对应返回一种抽象产品。
- 具体工厂:实现抽象工厂的方法。
- 抽象产品:它为每种产品声明接口,在抽象产品中声明了产品所具有的的业务方法。
- 具体产品:它定义具体工厂生产的具体产品对象,实现自抽象产品。
实现案例
比如以下有两套皮肤(Spring和Summer),皮肤有按钮、文本框、组合框颜色的不同
- 三种产品
package xyz.cglzwz.question_bank.afp;
/**
* 按钮接口,充当抽象产品
*
* @author chgl16
* @date 2018-03-12
*/
public interface Button {
public void display();
}
package xyz.cglzwz.question_bank.afp;
/**
* Spring按钮类,充当具体产品
*
* @author chgl16
* @date 2018-03-12
*/
public class SpringButton implements Button{
@Override
public void display() {
System.out.println("显示绿色按钮");
}
}
package xyz.cglzwz.question_bank.afp;
/**
* Summer按钮类,充当具体产品
*
* @author chgl16
* @date 2018-03-12
*/
public class SummerButton implements Button{
@Override
public void display() {
System.out.println("显示蓝色按钮");
}
}
package xyz.cglzwz.question_bank.afp;
/**
* 文本框接口,充当抽象产品
*
* @author chgl16
* @date 2018-03-12
*/
public interface TextField {
public void display();
}
package xyz.cglzwz.question_bank.afp;
/**
* Spring文本框类,充当具体产品
*
* @author chgl16
* @date 2018-03-12
*/
public class SpringTextField implements TextField {
@Override
public void display() {
System.out.println("显示绿色文本框");
}
}
package xyz.cglzwz.question_bank.afp;
/**
* Summer文本框类,充当具体产品
*
* @author chgl16
* @date 2018-03-12
*/
public class SummerTextField implements TextField {
@Override
public void display() {
System.out.println("显示蓝色文本框");
}
}
package xyz.cglzwz.question_bank.afp;
/**
* 组合框接口,充当抽象产品
*
* @author chgl16
* @date 2018-03-12
*/
public interface ComboBox {
public void display();
}
package xyz.cglzwz.question_bank.afp;
/**
* Spring组合框类,充当具体产品
*
* @author chgl16
* @date 2018-03-12
*/
public class SpringComboBox implements ComboBox {
@Override
public void display() {
System.out.println("显示绿色的组合框");
}
}
package xyz.cglzwz.question_bank.afp;
/**
* Summer组合框类,充当具体产品
*
* @author chgl16
* @date 2018-03-12
*/
public class SummerComboBox implements ComboBox {
@Override
public void display() {
System.out.println("显示蓝色组合框");
}
}
- 以下是工厂
package xyz.cglzwz.question_bank.afp;
/**
* 皮肤接口工厂接口,充当抽象工厂
*
* @author chgl16
* @date 2018-03-12
*/
public interface SkinFactory {
public Button createButton();
public TextField createTextField();
public ComboBox createComboBox();
}
package xyz.cglzwz.question_bank.afp;
/**
* Spring皮肤工厂,充当具体工厂
*
* @author chgl16
* @date 2018-03-12
*/
public class SpringSkinFactory implements SkinFactory {
@Override
public Button createButton() {
return new SpringButton();
}
@Override
public TextField createTextField() {
return new SpringTextField();
}
@Override
public ComboBox createComboBox() {
return new SpringComboBox();
}
}
package xyz.cglzwz.question_bank.afp;
/**
* Summer皮肤工厂,充当具体工厂
*
* @author chgl16
* @date 2018-03-12
*/
public class SummerSkinFactory implements SkinFactory {
@Override
public Button createButton() {
return new SummerButton();
}
@Override
public TextField createTextField() {
return new SummerTextField();
}
@Override
public ComboBox createComboBox() {
return new SummerComboBox();
}
}
- 运行App实例
package xyz.cglzwz.question_bank.afp;
/**
* 客户端运行类
*
* @author chgl16
* @date 2019-03-12
*/
public class App {
public static void main(String[] args) {
// 使用抽象层定义
SkinFactory skinFactory;
Button button;
TextField textField;
ComboBox comboBox;
// 获取对象
skinFactory = new SpringSkinFactory();
button = skinFactory.createButton();
textField = skinFactory.createTextField();
comboBox = skinFactory.createComboBox();
// 调用
button.display();
textField.display();
comboBox.display();
}
}
- 输出
显示绿色按钮
显示绿色文本框
显示绿色的组合框