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

}

}

相关推荐
qq_537562671 分钟前
跨语言调用C++接口
开发语言·c++·算法
wjs202412 分钟前
DOM CDATA
开发语言
一点程序12 分钟前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
Tingjct13 分钟前
【初阶数据结构-二叉树】
c语言·开发语言·数据结构·算法
C雨后彩虹14 分钟前
计算疫情扩散时间
java·数据结构·算法·华为·面试
2601_9498095918 分钟前
flutter_for_openharmony家庭相册app实战+我的Tab实现
java·javascript·flutter
猷咪40 分钟前
C++基础
开发语言·c++
IT·小灰灰41 分钟前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧43 分钟前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q43 分钟前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db