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();

}

}

相关推荐
云烟成雨TD1 天前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
Wenweno0o1 天前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
于慨1 天前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
swg3213211 天前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
gelald1 天前
SpringBoot - 自动配置原理
java·spring boot·后端
殷紫川1 天前
深入理解 AQS:从架构到实现,解锁 Java 并发编程的核心密钥
java
一轮弯弯的明月1 天前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
chenjingming6661 天前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
殷紫川1 天前
深入拆解 Java volatile:从内存屏障到无锁编程的实战指南
java
eddieHoo1 天前
查看 Tomcat 的堆内存参数
java·tomcat