工厂模式-简单工厂模式
工厂模式(Factory Pattern)是最常用的一类创建型设计模式,包含简单工厂模式(Simple Factory Pattern)、工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)
简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又称为静态工厂方法模式(Static Factory Method Pattern)
我们看一个具体的需求
一个披萨的项目,要便于披萨种类的拓展,要便于维护
- 披萨的种类有很多(比如 GreekPizz、CheesePizz等)
- 披萨的制作有prepare,bake,cut,box
- 完成披萨店的订购功能
public abstract class Pizza {
//pizza的名字
protected String name;
//准备原材料,不同pizza的原材料不一样,因此做成抽象方法
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;
}
}
public class CheesePizza extends Pizza{
@Override
public void prepare() {
System.out.println("制作奶酪披萨 准备原材料");
}
}
public class GreekPizza extends Pizza{
@Override
public void prepare() {
System.out.println("给希腊披萨准备原材料");
}
}
/**
* 简单工厂类
* 如果要增加披萨类直接修改工厂类即可
*/
public class SimpleFactory {
//根据orderType 返回对应的Pizza对象
public static Pizza createPizza(String orderType){
Pizza pizza = null;
System.out.println("使用简单工厂模式");
if (orderType.equals("greek")){
pizza = new GreekPizza();
pizza.setName("希腊披萨");
}else if (orderType.equals("cheese")){
pizza = new CheesePizza();
pizza.setName("奶酪披萨");
}
return pizza;
}
}
public class OrderPizza {
Pizza pizza = null;
String orderType = "";//用户输入
//构造器
public OrderPizza(){
do{
orderType = getType();
pizza = SimpleFactory.createPizza(orderType);
//输出pizza
if (pizza != null){
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else {
System.out.println("订购pizza失败");
break;
}
}while (true);
}
private String getType(){
try{
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type:");
String str = strin.readLine();
return str;
}catch (IOException e){
e.printStackTrace();
return "";
}
}
}
public class PizzaStore {
public static void main(String[] args) {
new OrderPizza();
System.out.println("退出程序");
}
}