系列文章目录
披萨订购—简单工厂模式
披萨订购—工厂方法模式
前言
Hello,小伙伴们,欢迎来到柚子的博客~让我们一起成长吧o( ̄▽ ̄)ブ
提示:以下是本篇文章正文内容,下面案例可供参考
一、简单工厂模式
1.简单工厂模式基本介绍
(1)简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。 简单工厂模式是工厂模式家族中最简单实用的模式。
(2)简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)。
(3)在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式。
2.简单工厂模式实现
(1)简单工厂模式的设计方案:定义一个可以实例化Pizza对象的类,封装创建对象的代码。
(2)代码实现:
(3)创建一个简单工厂类:
//简单工厂类
public class SimpleFactory {
//根据orderType,返回对应的Pizza对象
public Pizza createPizza(String orderType) {
Pizza pizza = null;
System.out.println("使用简单工厂模式~~");
if(orderType.equals("cheese")) {
pizza = new CheesePizza();
pizza.setName("奶酪披萨");
} else if (orderType.equals("greek")) {
pizza = new GreekPizza();
pizza.setName("希腊披萨");
} else if (orderType.equals("pepper")) {
pizza = new PepperPizza();
pizza.setName("胡椒披萨");
}
return pizza;
}
}
(4)制定一个订购披萨类:
//修改OrderPizza, 使用简单工厂模式来创建对象,更加的方便灵活
public class OrderPizza {
//定义一个简单工厂对象
SimpleFactory simpleFactory;
Pizza pizza = null;
//构造器
public OrderPizza(SimpleFactory simpleFactory) {
setFactory(simpleFactory);
}
public void setFactory(SimpleFactory simpleFactory) {
String orderType = getType();//用户输入的
this.simpleFactory = simpleFactory;//设置简单工厂对象
do {
orderType = getType();
pizza = this.simpleFactory.createPizza(orderType);
//输出pizza
if (pizza != null) {//订购成功
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println("订购披萨失败");
break;
}
} while(true);
}
//写一个方法,可以获取客户希望订购的披萨种类
private String getType() {
try {
BufferedReader strin = new BufferedReader(new InputStreamReader.class);
System.out.println("input pizza 种类:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
(5)创建披萨订购运行类:
//相当于一个客户端,发出订购
public class PizzaStore {
public static void main(String[] args) {
//使用简单工厂模式
new OrderPizza(new SimpleFactory());
System.out.println("退出程序~~");
}
}
(6)简单工厂模式的补充,使用静态方式:
//简单工厂类
public class SimpleFactory {
//简单工厂模式 也叫 静态工厂模式
public static Pizza createPizza2(String orderType) {
Pizza pizza = null;
System.out .println("使用简单工厂模式2");
if(orderType.equals("cheese")) {
pizza = new CheesePizza();
pizza.setName("奶酪披萨");
} else if (orderType.equals("greek")) {
pizza = new GreekPizza();
pizza.setName("希腊披萨");
} else if (orderType.equals("pepper")) {
pizza = new PepperPizza();
pizza.setName("胡椒披萨");
}
return pizza;
}
}
//修改OrderPizza, 使用简单工厂模式来创建对象,更加的方便灵活
public class OrderPizza2 {
Pizza pizza = "";
String orderType = "";
//构造器
public OrderPizza2() {
do {
orderType = getType();
pizza = SimpleFactory.createPizza2(orderType);
//输出pizza
if(pizza != null) { //订购成功
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println("订购披萨失败");
break;
}
} while (true);
}
//写一个方法,可以获取客户希望订购的披萨种类
private String getType() {
try {
BufferedReader strin = new BufferedReader(new InputStreamReader.class);
System.out.println("input pizza 种类:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
//相当于一个客户端,发出订购
public class PizzaStore {
public static void main(String[] args) {
//使用静态工厂模式
new OrderPizza2();
System.out.println("退出程序~~");
}
}
二、工厂方法模式
1.披萨订购的新需求
(1)披萨项目的新需求:客户在点披萨时,可以点不同口味的披萨,比如北京的奶酪pizza、北京的胡椒pizza 或者 是伦敦的奶酪pizza、伦敦的胡椒pizza。
(2)新需求的思路:
思路1:使用简单工厂模式,创建不同的简单工厂类,比如BJPizzaSimpleFactory、LDPizzaSimpleFactory 等等。从当前这个案例来说,也是可以的,但是考虑到项目的规模,以及软件的可维护性、可扩展性并不是特别好。
思路2:使用工厂方法模式 。
2.工厂方法模式介绍
(1)工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。
(2)工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
3.工厂方法模式实现
代码如下(示例):
(1)创建一个披萨抽象类:
public abstract class Pizza {
//披萨名字
protected String name;
//准备原材料,不同的披萨不一样,因此,我们做成抽象方法
public abstract void prepare();
//烘烤
public void bake() {
System.out.println(name + " baking;");
}
//切块
public void cut() {
System.out.println(name + " cuting;");
}
//打包
public void box() {
System.out.println(name + " boxing;");
}
public void setName(String name) {
this.name = name;
}
}
(2)创建四个继承pizza类的具体pizza:
public class BJCheesePizza extends Pizza {
@Override
public void prepare() {
setName("北京的奶酪pizza");
System.out.println("北京的奶酪pizza 准备原材料");
}
}
public class BJPepperPizza extends Pizza {
@Override
public void prepare() {
setName("北京的胡椒pizza");
System.out.println("北京的胡椒pizza 准备原材料");
}
}
public class LDCheesePizza extends Pizza {
@Override
public void prepare() {
setName("伦敦的奶酪pizza");
System.out.println("伦敦的奶酪pizza 准备原材料");
}
}
public class LDPepperPizza extends Pizza {
@Override
public void prepare() {
setName("伦敦的胡椒pizza");
System.out.println("伦敦的胡椒pizza 准备原材料");
}
}
(3)创建一个抽象的订购pizza类:
public abstract class OrderPizza {
//定义一个抽象方法,createPizza,让各个工厂子类自己实现
abstract Pizza createPizza(String orderType);
//构造器
public OrderPizza() {
Pizza pizza = null;
String orderType; //订购披萨的类型
do {
orderType = getType();
pizza = createPizza(orderType);//抽象方法,由工厂子类完成
//输出pizza 制作过程
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} while (true);
}
}
(4)创建两个继承订购pizza类的具体OrderPizza类:
public class BJOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if(orderType.equals("cheese")) {
pizza = new BJCheesePizza();
} else if (orderType.equals("pepper")) {
pizza = new BJPepperPizza();
}
return pizza;
}
}
public class LDOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if(orderType.equals("cheese")) {
pizza = new LDCheesePizza();
} else if (orderType.equals("pepper")) {
pizza = new LDPepperPizza();
}
return pizza;
}
}
(4)创建一个披萨订购运行类:
public class PizzaStore {
public static void main(String[] args) {
String loc = "bj";
if (loc.equals("bj")) {
//创建北京口味的各种pizza
new BJOrderPizza();
} else {
//创建伦敦口味的各种pizza
new LDOrderPizza();
}
}
}
总结
披萨订购—简单工厂模式
披萨订购—工厂方法模式
╭◜◝ ͡ ◜◝╮
( ˃̶͈◡˂ ̶͈ )感觉有用的话,欢迎点赞评论呀!
╰◟◞ ͜ ◟◞╯