创建型设计模式——工厂方法模式
Posted 张起灵-小哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建型设计模式——工厂方法模式相关的知识,希望对你有一定的参考价值。
1.什么是工厂方法模式?
- 工厂方法模式设计方案: 将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。
- 工厂方法模式: 定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
何时使用? 不同条件下创建不用实例时。方法是让子类实现工厂接口。
2.案例实现
假如说,我们现在有这样一个需求:客户在点披萨时,可以点不同口味的披萨,比如北京的奶酪pizza、北京的胡椒pizza 或者是 伦敦的奶酪pizza、伦敦的胡椒pizza。披萨的制作有prepare,bake, cut, box;完成披萨店订购功能。
那么可以画一个简单的类图如下:
具体的代码我们就可以这样写:↓↓↓↓↓↓
首先是一个Pizza类,这里将它声明为抽象类,主要原因是其中的prepare方法不是恒定不变的,而是由实现它的子类来完成。
package com.szh.factory.factorymethod.pizza;
/**
* 声明Pizza类为抽象类
*/
public abstract class Pizza
//Pizza名称
protected String name;
//准备原材料,不同的披萨不一样。因此,我们做成抽象方法,具体的原材料实现交给它的子类去完成
public abstract void prepare();
//烘烤
public void bake()
System.out.println(name + " baking;");
//切割
public void cut()
System.out.println(name + " cutting;");
//打包
public void box()
System.out.println(name + " boxing;");
public void setName(String name)
this.name = name;
package com.szh.factory.factorymethod.pizza;
public class BJCheesePizza extends Pizza
@Override
public void prepare()
setName("北京的奶酪pizza");
System.out.println("北京的奶酪pizza 准备原材料");
package com.szh.factory.factorymethod.pizza;
public class BJPepperPizza extends Pizza
@Override
public void prepare()
setName("北京的胡椒pizza");
System.out.println("北京的胡椒pizza 准备原材料");
package com.szh.factory.factorymethod.pizza;
public class LDCheesePizza extends Pizza
@Override
public void prepare()
setName("伦敦的奶酪pizza");
System.out.println("伦敦的奶酪pizza 准备原材料");
package com.szh.factory.factorymethod.pizza;
public class LDPepperPizza extends Pizza
@Override
public void prepare()
setName("伦敦的胡椒pizza");
System.out.println("伦敦的胡椒pizza 准备原材料");
下面是订购Pizza的相关代码。说制作披萨的原材料是什么怎么做,我们此时此刻不关心,那么就可以将它延迟到子类中实现。
package com.szh.factory.factorymethod.order;
import com.szh.factory.factorymethod.pizza.Pizza;
import java.util.Scanner;
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);
private String getType()
Scanner scanner = new Scanner(System.in);
System.out.println("请输入 pizza 种类: ");
String str = scanner.nextLine();
return str;
package com.szh.factory.factorymethod.order;
import com.szh.factory.factorymethod.pizza.BJCheesePizza;
import com.szh.factory.factorymethod.pizza.BJPepperPizza;
import com.szh.factory.factorymethod.pizza.Pizza;
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();
else
throw new NullPointerException("暂无该Pizza种类....");
return pizza;
package com.szh.factory.factorymethod.order;
import com.szh.factory.factorymethod.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();
else
throw new NullPointerException("暂无该Pizza种类....");
return pizza;
最后我们测试一下。
package com.szh.factory.factorymethod;
import com.szh.factory.factorymethod.order.BJOrderPizza;
import com.szh.factory.factorymethod.order.LDOrderPizza;
import java.util.Scanner;
public class MainTest
public static void main(String[] args)
Scanner scanner = new Scanner(System.in);
String content = scanner.next();
if (content.equals("Beijing"))
new BJOrderPizza();
else if (content.equals("London"))
new LDOrderPizza();
else
System.out.println("无法预先匹配Pizza种类....");
scanner.close();
3.JDK中的工厂方法模式
在 java.util.Calendar 这个类中就有。
以上是关于创建型设计模式——工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章