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 小时前
【开题答辩全过程】以 基于JavaWeb的疾病查询系统的设计与实现为例,包含答辩的问题和答案
java·eclipse
雨中飘荡的记忆19 小时前
Java面向对象编程详解
java·开发语言
zhangyifang_00919 小时前
Spring中的BeanFactory类
java·后端·spring
大学生资源网20 小时前
java毕业设计之面向校园的助力跑腿系统设计与实现源码(源码+文档+数据库)
java·数据库·mysql·毕业设计·源码·springboot
quikai198120 小时前
python练习第六组
java·前端·python
222you20 小时前
线程的常用方法
java·开发语言
云栖梦泽20 小时前
易语言界面美化与组件扩展
开发语言
catchadmin20 小时前
PHP 值对象实战指南:避免原始类型偏执
android·开发语言·php
Trouville0120 小时前
Python中encode和decode的用法详解
开发语言·python
是梦终空20 小时前
JAVA毕业设计259—基于Java+Springboot+vue3工单管理系统的设计与实现(源代码+数据库+开题报告)
java·spring boot·vue·毕业设计·课程设计·工单管理系统·源代码