针接口编程的时候,如果代码在未来有需要增加实现类,则需要将实例化代码的部分抽取出来(即将变化的部分从不变的部分分离出来)
Pizza orderPizza(String type){
Pizza pizza;
if(type.equal("cheese")){
pizza = new CheesePizza();
}else if(type.equal("pepperoni")){
pizza = new PepperoniPizza();
}else if(type.equals("clam")){
pizza = new ClamPizza();
}
pizza.prepare();
pizza.bake();
}
将pizza具体实现分离出来
Pizza orderPizza(String type){
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.bake();
}
//将创建pizza的实现封装起来
Pizza createPizza(String type){
Pizza pizza;
if(type.equal("cheese")){
pizza = new CheesePizza();
}else if(type.equal("pepperoni")){
pizza = new PepperoniPizza();
}else if(type.equals("clam")){
pizza = new ClamPizza();
}
return pizza;
}
如果其他这样如果在其他地方需要piazza的具体实现类时,可以将直接调用createPizza(type)得到一个Pizza的实现类,不再类里面写Pizza类的具体的实现,
继续改造
package pizza;
//产品抽象类
public abstract class Pizza {
public void prepare() {
}
public void bake() {
}
public void cat() {
}
public void box() {
}
}
package pizza;
//具体产品
public class ChessePizza extends Pizza{
}
package pizza;
//具体产品
public class ClamePizza extends Pizza {
}package pizza;//工厂类public class SimplePizzaFactory { public Pizza createPizza(String type){ Pizza pizza = null; if("chesse".equals(type)){ pizza = new ChessePizza(); }else if("clame".equals(type)){ pizza = new ClamePizza(); } return pizza; }}package pizza;public class PizzaStore {SimplePizzaFactory simplePizzaFactory ;public PizzaStore(SimplePizzaFactory simplePizzaFactory){this.simplePizzaFactory = simplePizzaFactory;}public Pizza orderPizza(String type){Pizza pizza = simplePizzaFactory.createPizza(type);//调用产品类的方法做相关操作//如pizza类的切片、装盒等pizza.prepare();pizza.bake();pizza.cat();pizza.box();return pizza;}}
将factory作为参数放入Pizza的构造器里面使得Pizza类的实现必须调用SimplePizzaFactory类来创建Pizza。