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

}

}

相关推荐
东小西19 分钟前
【SAA实战】第 1 篇:ReactAgent 入门——先撸个"会调工具的助手"跑起来
java·人工智能·spring
mqiqe1 小时前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
lzhdim1 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
脉动数据行情1 小时前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股
爱学习的小邓同学1 小时前
Golang --- (1)第一个Golang程序
开发语言·后端·golang
zx_741484812 小时前
【Python 入门】面向对象基础:类、对象、成员变量与构造方法
开发语言·python
月华路3 小时前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法
liangshanbo12154 小时前
虚拟列表深度面试题整理
java·开发语言·前端
ZISHU_9874 小时前
用 TLabel 给 SynTouch BioTac 数据做语义标注:从原始信号到结构化标注
开发语言·人工智能·python·数据·机器人触觉
略略略咯咯4 小时前
C#Unity
开发语言·unity·c#