package factory;
/**
* @author jiq
* 类型:Creational
* 定义: 工厂方法模式(Factory Method)定义一个创建对象的接口,但由子类决定
* 要实例化的类是哪一个。 工厂方法将类的实例化推迟到子类。
* OO原则: 要依赖抽象,而不要依赖具体类
*/
/************
* Pizza商店
* **********/
abstract class PizzaStore{
public Pizza oderPizza(String type){
Pizza pizza;
/**
* 提供抽象接口来创建“具体产品”
* 超类并不知道正在创建的是什么pizza
* */
pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
/**
* 工厂方法来处理具体对象的创建,
* 并将这样的创建推迟到子类中。
* 这样客户程序中关于超类的代码就和创建子类的代码解耦了
*
* 并不涉及具体类的创建,而是将各种pizza的创建交给各个商店
* */
abstract Pizza createPizza(String type);
}
//纽约Pizza店
class NYPizzaStore extends PizzaStore{
//子类实现工厂方法来创建具体的Pizza
public Pizza createPizza(String type) {
if(type.equals("cheese")){
return new NYSytleCheesePizza();
}
else if(type.equals("viggie")){
return new NYSytleViggiePizza();
}
else if(type.equals("clam")){
return new NYSytleClamPizza();
}
else return null;
}
}
//芝加哥Pizza店
class ChicagoPizzaStore extends PizzaStore{
//子类实现工厂方法来创建具体的Pizza
public Pizza createPizza(String type) {
if(type.equals("cheese")){
return new ChicagoStyleCheesePizza();
}
else if(type.equals("clam")){
return new ChicagoStyleClamPizza();
}
else return null;
}
}
/********************************
* Pizza
* ******************************/
abstract class Pizza{
String name;
String dough;
String sauce;
void prepare(){System.out.println("Preparing:"+name);}
void bake(){System.out.println("Bake 25 minutes at 250");}
void cut(){System.out.println("Cutting the Pizza");}
void box(){System.out.println("Box it in cartton box");}
}
/**
* 各种纽约风格的Pizza
* */
class NYSytleCheesePizza extends Pizza{}
class NYSytleViggiePizza extends Pizza{}
class NYSytleClamPizza extends Pizza{}
/**
* 各种芝加哥风格的Pizza
* */
class ChicagoStyleCheesePizza extends Pizza{}
class ChicagoStyleClamPizza extends Pizza{}
/**
* 客户端程序,客户预订Pizza
* */
public class FactoryMethod {
public static void main(String[] args) {
/* 创建两个Pizza商店 */
PizzaStore nyStore = new NYPizzaStore();
PizzaStore cgStore = new ChicagoPizzaStore();
/* 使用PizzaStore下订单 */
Pizza pizza1 = nyStore.oderPizza("cheese");
Pizza pizza2 = cgStore.oderPizza("cheese");
}
}
创建型-工厂方法
最新推荐文章于 2024-12-27 09:24:12 发布