核心:只持有抽象的接口引用,由子类去决定实例的创建,将实例化推到子类中去。
同样采用Pizza的例子,当纽约(NY)和芝加哥(Chicago)都开了pizza店,且者两个地方的同类型Pizza味道不同。可以构建如下类:
可以看到createPizza在父类中申明为抽象的,用户首先得创建一个店,NYPizzaStore store,当用户调用AbstractPizzaStore.orderPizza()时,orderPizza()转而调用AbstractPizzaStore.createPizza方法,由于这个方法是抽象的,所以调用的是子类的NYPizzaStore.createPizza(),这个方法根据字符串type返回不同的Pizza。代码如下:
首先是Pizza超类
package Factory.MethodFactory;
/**
* Created by sgzhang on 2015/8/12.
*/
public abstract class Pizza {
abstract void eat();
}
接着ChicagoPizza群
//ChicagoCheesePizza
package Factory.MethodFactory;
/**
* Created by sgzhang on 2015/8/12.
*/
public class ChicagoCheesePizza extends Pizza{
@Override
void eat() {
System.out.println("ChicagoCheesePizza");
}
}
//ChicagoGreekPizzapackage Factory.MethodFactory;
/**
* Created by sgzhang on 2015/8/12.
*/
public class ChicagoGreekPizza extends Pizza{
@Override
void eat() {
System.out.println("ChicagoGreekPizza");
}
}
//ChicagoHotPizza
package Factory.MethodFactory;
/**
* Created by sgzhang on 2015/8/12.
*/
public class ChicagoHotPizza extends Pizza{
@Override
void eat() {
System.out.println("ChicagoHotPizza");
}
}
//NYCheesePizza
package Factory.MethodFactory;
/**
* Created by sgzhang on 2015/8/12.
*/
public class NYCheesePizza extends Pizza {
@Override
void eat() {
System.out.println("NYCheesePizza");
}
}
//NYGreekPizza
package Factory.MethodFactory;
/**
* Created by sgzhang on 2015/8/12.
*/
public class NYGreekPizza extends Pizza{
@Override
void eat() {
System.out.println("NYGreekPizza");
}
}
//NYHotPizza
package Factory.MethodFactory;
/**
* Created by sgzhang on 2015/8/12.
*/
public class NYHotPizza extends Pizza{
@Override
void eat() {
System.out.println("NYHotPizza");
}
}
然后是store(工厂)超类
package Factory.MethodFactory;
/**
* Created by sgzhang on 2015/8/12.
*/
public abstract class PizzaStore {
public Pizza orderPizza(String type){
Pizza pizza=createPizza(type);
return pizza;
}
protected abstract Pizza createPizza(String type);
}
//ChicagoPizzaStore
package Factory.MethodFactory;
/**
* Created by sgzhang on 2015/8/12.
*/
public class ChicagoPizzaStore extends PizzaStore {
@Override
public Pizza createPizza(String type) {
Pizza pizza=null;
if(type.equals("Cheese")){
pizza=new ChicagoCheesePizza();
}else if(type.equals("Greek")){
pizza=new ChicagoGreekPizza();
}else{
pizza=new ChicagoHotPizza();
}
return pizza;
}
}
//NYPizzaStore
package Factory.MethodFactory;
/**
* Created by sgzhang on 2015/8/12.
*/
public class NYPizzaStore extends PizzaStore {
@Override
public Pizza createPizza(String type) {
Pizza pizza=null;
if(type.equals("Cheese")){
pizza=new NYCheesePizza();
}else if(type.equals("Greek")){
pizza=new NYGreekPizza();
}else{
pizza=new NYHotPizza();
}
return pizza;
}
}
大功告成,接下来就是测试了
package Factory.MethodFactory;
/**
* Created by sgzhang on 2015/8/12.
*/
public class FactoryRun {
public static void main(String[] args){
PizzaStore pizzaStore=new ChicagoPizzaStore();
Pizza pizza=pizzaStore.orderPizza("Cheese");
pizza.eat();
}
}
可以看到打印出来了
ChicagoCheesePizza