0
点赞
收藏
分享

微信扫一扫

【设计模式】-工厂模式->抽象工法模式(源码与类图解析)


一 基本介绍

  1. 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
  2. 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
  3. 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
  4. 将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。
  5. 类图
  6. 【设计模式】-工厂模式->抽象工法模式(源码与类图解析)_抽象工厂模式

二 应用实例

2.1 Pizza 类

package com.yqq.pattern.factory.abs.pizza;

/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/18/20:15
* @Description:
*/
public abstract class Pizza {
protected String name;//名字
//准备材料,不同的披萨是不一样的,做成抽象方法
public abstract void prepare();

public void bake() {
System.out.println(name + " baking;");
}
public void cut() {
System.out.println(name + " cutting;");
}
public void box() {
System.out.println(name + " boxing;");
}
public void setName(String name) {
this.name = name;
}
}

2.2 LDPepperPizza 类

package com.yqq.pattern.factory.abs.pizza;

/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/14:13
* @Description:
*/
public class LDPepperPizza extends Pizza {
public void prepare() {
this.setName("伦敦的胡椒披萨");
System.out.println("伦敦的胡椒披萨 准备原材料");
}
}

2.3 LDCheesePizza类

package com.yqq.pattern.factory.abs.pizza;

/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/14:13
* @Description:
*/
public class LDCheesePizza extends Pizza {
public void prepare() {
this.setName("伦敦的奶酪披萨");
System.out.println("伦敦的奶酪披萨 准备原材料");
}
}

2.4 BJPepperPizza类

package com.yqq.pattern.factory.abs.pizza;

/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/14:13
* @Description:
*/
public class BJPepperPizza extends Pizza {
public void prepare() {
this.setName("北京的胡椒披萨");
System.out.println("北京的胡椒披萨 准备原材料");
}
}

2.5 BJCheesePizza类

package com.yqq.pattern.factory.abs.pizza;

/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/14:13
* @Description:
*/
public class BJCheesePizza extends Pizza {
public void prepare() {
this.setName("北京的奶酪披萨");
System.out.println("北京的奶酪披萨 准备原材料");
}
}

2.6 AbsFactory类

package com.yqq.pattern.factory.abs.order;

import com.yqq.pattern.factory.abs.pizza.Pizza;

/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/23:13
* @Description: 抽象工厂模式的抽象接口
*/
public interface AbsFactory {
//让下面的工厂子类来具体实现
public Pizza createPizza(String orderType);
}

2.7 BJFactory类

package com.yqq.pattern.factory.abs.order;

import com.yqq.pattern.factory.abs.pizza.BJCheesePizza;
import com.yqq.pattern.factory.abs.pizza.BJPepperPizza;
import com.yqq.pattern.factory.abs.pizza.Pizza;

/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/23:15
* @Description:
*/
public class BJFactory implements AbsFactory{
public Pizza createPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese"))
pizza = new BJCheesePizza();
else if (orderType.equals("pepper"))
pizza = new BJPepperPizza();
return pizza;
}
}

2.8 LDFactory类

package com.yqq.pattern.factory.abs.order;

import com.yqq.pattern.factory.abs.pizza.*;

/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/23:34
* @Description:
*/
public class LDFactory implements AbsFactory{
public Pizza createPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese"))
pizza = new LDCheesePizza();
else if (orderType.equals("pepper"))
pizza = new LDPepperPizza();
return pizza;
}
}

2.9 OrderPizza类

package com.yqq.pattern.factory.abs.order;

import com.yqq.pattern.factory.abs.pizza.Pizza;

import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/23:35
* @Description:
*/
public class OrderPizza {
AbsFactory factory;
public OrderPizza(AbsFactory factory){
setAbsFactory(factory);
}
public void setAbsFactory(AbsFactory factory){
Pizza pizza = null;
String orderType = "";//用户输入
this.factory = factory;
do {
orderType = getType();
pizza = factory.createPizza(orderType);
if (pizza != null){
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else {
System.out.println("订购失败");
break;
}
}while (true);
}

private String getType(){
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza 类型:");
String line = reader.readLine();
return line;
}catch (Exception e){
e.fillInStackTrace();
return null;
}
}
}

2.10 PizzaStore类(测试)

package com.yqq.pattern.factory.abs.order;

/**
* Created with IntelliJ IDEA.
*
* @Author: yqq
* @Date: 2022/08/19/23:43
* @Description:
*/
public class PizzaStore {
public static void main(String[] args) {
new OrderPizza(new LDFactory());
}
}

【设计模式】-工厂模式->抽象工法模式(源码与类图解析)_设计模式_02


举报

相关推荐

0 条评论