工廠方法模式(FACTORY METHOD)是一種常用的類創(chuàng)建型設(shè)計模式,此模式的核心精神是封裝類中變化的部分,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦、復(fù)用和方便后期維護拓展的目的。它的核心結(jié)構(gòu)有四個角色,分別是抽象工廠;具體工廠;抽象產(chǎn)品;具體產(chǎn)品
package com.strife.pattern.factory;
/**
* 工廠方法模式
*
* @author mengzhenghao
* @date 2022/5/28
*/
public class FactoryMethod {
public static void main(String[] args) throws Exception {
new BjPizzaFactory("cheese");
new BjPizzaFactory("pepper");
new LdPizzaFactory("cheese");
new LdPizzaFactory("cheese");
}
}
/** 訂購披薩 (抽象工廠)*/
abstract class AbstractPizzaFactory {
public AbstractPizzaFactory(String pizzaType) throws Exception {
AbstractPizza pizza = makePizza(pizzaType);
if (pizza != null) {
pizza.prepare();
pizza.box();
} else {
System.out.println("暫無該品種");
}
}
/** 制作披薩 */
public abstract AbstractPizza makePizza(String pizzaType) throws Exception;
}
/** 北京披薩工廠(具體工廠) */
class BjPizzaFactory extends AbstractPizzaFactory {
public BjPizzaFactory(String pizzaType) throws Exception {
super(pizzaType);
}
@Override
public AbstractPizza makePizza(String pizzaType) throws Exception {
for (BjPizzaTypeEnum pizzaTypeEnum : BjPizzaTypeEnum.values()) {
if (pizzaType.equals(pizzaTypeEnum.getPizzaType())) {
return (AbstractPizza) Class.forName(pizzaTypeEnum.getClazz()).newInstance();
}
}
return null;
}
}
/** 倫敦披薩工廠(具體工廠) */
class LdPizzaFactory extends AbstractPizzaFactory {
public LdPizzaFactory(String pizzaType) throws Exception {
super(pizzaType);
}
@Override
public AbstractPizza makePizza(String pizzaType) throws Exception {
for (LdPizzaTypeEnum pizzaTypeEnum : LdPizzaTypeEnum.values()) {
if (pizzaType.equals(pizzaTypeEnum.getPizzaType())) {
return (AbstractPizza) Class.forName(pizzaTypeEnum.getClazz()).newInstance();
}
}
return null;
}
}
/** 披薩(抽象產(chǎn)品) */
abstract class AbstractPizza {
/** 準備原材料 */
public abstract void prepare();
/** 打包 */
public abstract void box();
}
/** 北京奶酪披薩(具體產(chǎn)品) */
class BjCheesePizza extends AbstractPizza {
@Override
public void prepare() {
System.out.println("北京奶酪披薩準備原材料");
}
@Override
public void box() {
System.out.println("北京奶酪披薩準備打包");
}
}
/** 北京胡椒披薩(具體產(chǎn)品)*/
class BjPepperPizza extends AbstractPizza {
@Override
public void prepare() {
System.out.println("北京胡椒披薩準備原材料");
}
@Override
public void box() {
System.out.println("北京胡椒披薩準備打包");
}
}
/** 倫敦奶酪披薩(具體產(chǎn)品) */
class LdCheesePizza extends AbstractPizza {
@Override
public void prepare() {
System.out.println("倫敦奶酪披薩準備原材料");
}
@Override
public void box() {
System.out.println("倫敦奶酪披薩準備打包");
}
}
/** 倫敦胡椒披薩(具體產(chǎn)品)*/
class LdPepperPizza extends AbstractPizza {
@Override
public void prepare() {
System.out.println("倫敦胡椒披薩準備原材料");
}
@Override
public void box() {
System.out.println("倫敦胡椒披薩準備打包");
}
}
enum BjPizzaTypeEnum {
/** 北京奶酪披薩*/
CHEESE("cheese", "com.strife.pattern.factory.BjCheesePizza"),
/** 北京胡椒披薩*/
PEPPER("pepper", "com.strife.pattern.factory.BjPepperPizza");
private final String pizzaType;
private final String clazz;
BjPizzaTypeEnum(String pizzaType, String clazz) {
this.pizzaType = pizzaType;
this.clazz = clazz;
}
public String getPizzaType() {
return pizzaType;
}
public String getClazz() {
return clazz;
}
}
enum LdPizzaTypeEnum {
/** 倫敦奶酪披薩*/
CHEESE("cheese", "com.strife.pattern.factory.LdCheesePizza"),
/** 倫敦胡椒披薩*/
PEPPER("pepper", "com.strife.pattern.factory.LdPepperPizza");
private final String pizzaType;
private final String clazz;
LdPizzaTypeEnum(String pizzaType, String clazz) {
this.pizzaType = pizzaType;
this.clazz = clazz;
}
public String getPizzaType() {
return pizzaType;
}
public String getClazz() {
return clazz;
}
}