一个重要的提醒:在设计模式中,所谓的“实现一个接口”并“不一定”表示“写一个类”并用implement关键词来实现某个Java接口。“实现一个接口”泛指“实现某个超类型(可以是类或接口)的某个方法”。
书中例子继续~~~
书中要开加盟店,并且Pizza要加入当地的风味,但是仍然要沿用主店的做法手艺(即沿用主类不变的东西,扩展可变的东西)
再来回顾上一篇代码:
package com.zl.factory.one;
public class PizzaStore {
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory){
this.factory=factory;
}
public Pizza orderPizza(String type){
Pizza pizza;
pizza=factory.createPizza(type);
pizza.prepare();//不变
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
由于加盟店和主店就Pizza种类不同,所以将上面的主类修改成一个超类,被其他的加盟店进行继承。而又因为每个加盟店制造Pizza的风味各不同,所以将createPizza()方法进行抽象,即为工厂方法。
public abstract class PizzaStore {
public Pizza OrderPizza(String type){
Pizza pizza;
pizza=createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(String type);
}
public class NYStorePizzStore extends PizzaStore {
@Override
protected Pizza createPizza(String type) {
Pizza pizza;
if(type.equals("cheese")){
pizza =new NYStyleCheesePizza();
}else if(type.equals("greek")){
pizza =new NYStyleGreekPizza();
}else if(type.equals("pepper")){
pizza =new NYStylePepperoniPizza();
}
return pizza;
}
}
声明一个工厂方法:
工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样,客户程序中关于超类的代码就和子类对象创建代码解耦了。
abstract Product factoryMethod(String type)
1.工厂方法是抽象的,所以依赖子类来处理对象的创建。
2.工厂方法必须返回一个产品。超类中定义的方法,通常使用到工厂方法的返回值。
3.工厂方法将客户(也就是超类中的代码)和实际创建具体产品的代码分隔开来。
4.工厂方法可能需要参数,也可能不用参数。
Pizza类:
package com.zl.factory.two;
public abstract class Pizza {
String name;
String dough;
String sauce;
public void prepare(){
System.out.println("prepare");
}
public void bake(){
System.out.println("bake");
}
public void cut(){
System.out.println("cut");
}
public void box(){
System.out.println("box");
}
public String getName(){
return name;
}
}
package com.zl.factory.two;
public class NYStyleCheesePizza extends Pizza {
public NYStyleCheesePizza(){
name="NYStyleCheesePizza name";
dough="NYStyleCheesePizza dough";
sauce="NYStyleCheesePizza sauce";
}
}
测试吃pizza类:
public static void main(String[] args) {
// TODO Auto-generated method stub
PizzaStore nyStore=new NYStorePizzStore();
Pizza pizza=nyStore.OrderPizza("cheese");
System.out.print(pizza.name);
System.out.print(pizza.dough);
System.out.print(pizza.sauce);
}
工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。