工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品
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;
}
}
/** 披萨(抽象产品) */
abstract class AbstractPizza {
/** 准备原材料 */
public abstract void prepare();
/** 打包 */
public abstract void box();
}
/** 北京奶酪披萨(具体产品) */
class BjCheesePizza extends AbstractPizza {
@Override
public void prepare() {
System.out.println("北京奶酪披萨准备原材料");
}
@Override
public void box() {
System.out.println("北京奶酪披萨准备打包");
}
}
/** 北京胡椒披萨(具体产品)*/
class BjPepperPizza extends AbstractPizza {
@Override
public void prepare() {
System.out.println("北京胡椒披萨准备原材料");
}
@Override
public void box() {
System.out.println("北京胡椒披萨准备打包");
}
}
/** 伦敦奶酪披萨(具体产品) */
class LdCheesePizza extends AbstractPizza {
@Override
public void prepare() {
System.out.println("伦敦奶酪披萨准备原材料");
}
@Override
public void box() {
System.out.println("伦敦奶酪披萨准备打包");
}
}
/** 伦敦胡椒披萨(具体产品)*/
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;
}
}