Java中的简单工厂模式

简单工厂模式

问题引出:假如有一个披萨店,Pizza的种类有很多,如奶酪披萨、蔬菜披萨、水果披萨等。披萨店根据收到的订单制作Pizza,如何实现?

简单工厂模式是属于创建型模式,但不属于23种GOF设计模式之一,简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

简单工厂模式中包含如下角色:

Factory:工厂角色,工厂角色负责实现创建所有实例的内部逻辑。

Product:抽象产品角色,抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口。

CreateProduct:具体产品角色,具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。

使用场景:

工厂类负责创建的对象比较少;

客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。

代码实现:

package org.jayce.bean;

//披萨父类

public class Pizza {

public Pizza() { super(); }

/**

* 带参数的构造方法

*

* @param name 名字

* @param size 尺寸

* @param flavor 风味

* @param price 价格

*/

public Pizza(String name, int size, String flavor, int price) {

super();

this.name = name;

this.size = size;

this.flavor = flavor;

this.price = price;

}

/**

* 名称

*/

protected String name;

/**

* 尺寸

*/

protected int size;

/**

* 风味

*/

protected String flavor;

/**

* 价格

*/

protected int price;

/**

* 显示信息方法

*/

public void show() {

System.out.println("\n------------披萨信息介绍--------------\n");

System.out.println("名称:" + this.name);

System.out.println("尺寸:" + this.size + "寸");

System.out.println("风味:" + this.flavor);

System.out.println("价格:" + this.price + "元");

}

//setter、getter方法省略

}

package org.jayce.bean;

//水果披萨子类

public class FruitPizza extends Pizza {

public FruitPizza() { super(); }

/**

* 带参数的构造方法

*

* @param name 名称

* @param size 尺寸

* @param flavor 风味

* @param price 价格

* @param fruitName 水果种类

*/

public FruitPizza(String name, int size, String flavor, int price, String fruitName) {

super(name, size, flavor, price);

this.fruitName = fruitName;

}

/**

* 水果种类

*/

private String fruitName;

/**

* 显示信息方法

*/

@Override

public void show() {

super.show();

System.out.println("水果种类:" + this.fruitName);

}

//setter、getter方法省略

}

package org.jayce.bean;

//蔬菜披萨

public class VegetablePizza extends Pizza {

public VegetablePizza() { super(); }

/**

* 带参数构造

*

* @param name 名称

* @param size 尺寸

* @param flavor 风味

* @param price 价格

* @param vegetableName 蔬菜种类

* @param isCooked 蔬菜是否烹饪

*/

public VegetablePizza(String name, int size, String flavor, int price, String vegetableName, boolean isCooked) {

super(name, size, flavor, price);

this.vegetableName = vegetableName;

this.isCooked = isCooked;

}

/**

* 蔬菜种类

*/

private String vegetableName;

/**

* 蔬菜是否烹饪

*/

private boolean isCooked;

/**

* 显示信息

*/

@Override

public void show() {

super.show();

System.out.println("蔬菜种类:" + this.vegetableName);

System.out.println("是否烹饪:" + (this.isCooked ? "蔬菜已烹饪" : "新鲜蔬菜"));

}

//setter、getter方法省略

}

package org.jayce.bean;

//披萨的工厂类

public class PizzaFactory {

/**

* 生产产品的方法

*

* @param name 名称

* @param size 尺寸

* @param flavor 风味

* @param price 价格

* @param fruitName 水果种类

* @param vegetableName 蔬菜种类

* @param isCooked 是否烹饪

* @return 披萨父类对象

*/

public static Pizza builder(String name, int size, String flavor, int price, String fruitName,

String vegetableName, boolean isCooked) {

if (fruitName != null) {

return new FruitPizza(name, size, flavor, price, fruitName);

} else if (vegetableName != null) {

return new VegetablePizza(name, size, flavor, price, vegetableName,isCooked);

}

return null;

}

}

//测试类

public class TestPizza {

public static void main(String\[\] args) {

Pizza pizza1=PizzaFactory.builder("榴莲披萨", 8, "香脆", 120, "榴莲", null, false);

pizza1.show();

Pizza pizza2=PizzaFactory.builder("胡萝卜披萨", 12, "软糯", 300, null, "胡萝卜", false);

pizza2.show();

}

}

相关推荐
用户128526116021 天前
我把祖传Java项目重构后,接口响应从3s砍到了200ms,只改了这几行代码
java
Linsk1 天前
组件 = 模板 + 业务逻辑
java·前端·vue.js
星沉远浦1 天前
用Gemini高效解决Java代码报错难以定位的问题
java
用户298698530141 天前
Word 文档字符级格式化:Java 实现方案详解
java·后端
笨鸟飞不快1 天前
从单个服务到集群:一次完整的性能排查复盘
java·前端
荣码1 天前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
SamDeepThinking1 天前
Java微服务练习方式
java·后端·微服务
朦胧之2 天前
AI 编程-老项目改造篇
java·前端·后端
程序猿大帅2 天前
别再只当调包侠了:用 Spring AI 落地 Function Calling,我被大模型硬生生砸出了三个大坑
java
程序员晓琪2 天前
约定大于配置:基于 Java 包名自动生成 API 版本路由的最佳实践
java·spring boot·后端