在真正的工厂方法之前,先学习下简单的工厂思想。
假定你是pizza店的老板
现在有一个pizza 类
public abstract class Pizza {
public void prepare(){
System.out.println("准备开始做");
}
public void bake(){
System.out.println("准备烘焙");
}
public void cut(){
System.out.println("开始切");
}
}
有几种Pizza
public class CheesePizza extends Pizza {
CheesePizza (){
this.name="cheese";
}
}
public class PepperonPizza extends Pizza{
PepperonPizza(){
this.name="Pepperon";
}
}
public class DefaultPizza extends Pizza{
public DefaultPizza() {
this.name="default";
}
}
订单
public class OrderPizza {
Pizza p;
public OrderPizza(String type) {
if(type.equals("cheese")){
p=new CheesePizza();
}
else if(type.equals("pepperonPizza")){
p=new PepperonPizza();
}else{
p=new DefaultPizza();
}
p.prepare();
p.bake();
p.cut();
}
}
测试类
public class TestPizza {
public static void main(String[] args) {
OrderPizza op=new OrderPizza("cheese");
}
}
准备开始做cheesepizza
准备烘焙
开始切
那么现在的问题是什么呢?
如果加入新的pizza种类的话,不得不修改Order类、
每一次都涉及到修改
也就是if判断这一段
而后面的流程都是没有涉及到改变的。
解决办法 -封装创建对象的代码
首先创建一个工厂类
public class SimplePizzaFactory {
public Pizza creatPizza(String type){
Pizza p;
if(type.equals("cheese")){
p=new CheesePizza();
}
else if(type.equals("pepperonPizza")){
p=new PepperonPizza();
}else{
p=new DefaultPizza();
}
return p;
}
}
然后修改OrederPizaa
public class OrderPizza {
Pizza p;
public OrderPizza(String type) {
p=new SimplePizzaFactory().creatPizza(type);//change
p.prepare();
p.bake();
p.cut();
}
}
好处:
简单的说,工厂类并不仅仅服务于一个OrderPizza,每一个都可以用这个工厂,不用自己去涉及到修改
每次修改都会成为全局的修改
当然这仅仅是一个简答的工厂模式,还不算是真正的设计模式。