传统方式解决披萨订购(工厂模式实例)
包1:
披萨
package com.atguigu.design.factory;
//将pizza做成抽象类
public abstract class Pizza {
protected String name;
public abstract void prepare();//抽象方法,不同pizza的准备方法不同,所以 把prepare做成抽象的
public void bake() {
System.out.println(name+"bakeing;"); }
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.atguigu.design.factory;
public class cheesepizza extends Pizza {
@Override
public void prepare() {
System.out.println("给芝士披萨准备原材料");
}
}
胡椒披萨:
package com.atguigu.design.factory;
public class Paperpizza extends Pizza{
public void prepare() {
System.out.println("给胡椒披萨准备原材料");
};
}
希腊披萨
package com.atguigu.design.factory;
//pizza类做成抽象的
public class Greekpizza extends Pizza {
@Override
public void prepare() {
System.out.println("给希腊披萨准备原材料!!!");
}
}
**包2: **
订购披萨:
package com.atguigu.design.Orderfactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import com.atguigu.design.factory.Greekpizza;
import com.atguigu.design.factory.Pizza;
import com.atguigu.design.factory.cheesepizza;
public class Orderpizza {
//构造器
public Orderpizza() {
Pizza pizza=null;
String orderType;//订购披萨的类型
do {
orderType=getType();
if(orderType.equals("greek")) {
pizza=new Greekpizza();
pizza.setName("希腊披萨");
}else if(orderType.equals("cheese")){
pizza=new cheesepizza();
pizza.setName("芝士披萨");//设置在不同包里面的属性,可以通过调用之前包里的方法来实现
}else {
System.out.println("订购披萨失败!!!");
break;
}
//输出披萨制作过程
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}while(true);
}
private String getType() {//获取订单
try {
BufferedReader strin =new BufferedReader(new
InputStreamReader(System.in));
System.out.println("input pizza 种类:");
String str=strin.readLine();
return str;
}catch (IOException e) {
e.<u>printStackTrace</u>();
return "";
}
}
}
//如何更改名字:设置在不同包里面的属性,可以通过调用之前包里的方法来实现
传统方法的优缺点:
**优点:**好理解
**缺点:**违反了设计模式的ocp原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改
比如:我们要新增加一个Pizza种类就需要啊修改如下