//简单工厂模式
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;
}
}
//将经常要改变的代码用简单工厂来完成
public class SimplePizzaFactory{
public Pizza createPizza(String type){
Pizza pizza=null;
if(type.equals("cheese")){
pizza=new CheesePizza();
}else if(type.equals("pepperoni")){
pizza=new PepperoniPizza();
}else if(type.equals("clam")){
pizza=new ClamPizza();
}else if(type.equals("veggie")){
pizza=new VeggiePizza();
}
return pizza;
}
}
//工厂方法
public abstract class PizzaStore{
public Pizza orderPizza(String type){
Pizza pizza=null;
pizza=createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(String type); //实例化比萨的责任被移到一个“方法”中,此方法就如同是一个工厂
}
//实际实现的PizzaStore
public class NYPizzaStore extends PizzaStore{
Pizza createPizza(String item){
if(item.equals("cheese")){
return new NYStyleCheesePizza();
}else if(item.equals("veggie")){
return new NYStyleVeggiePizza();
}else if(item.equals("clam")){
return new NYStyleClamPizza();
}else if(item.equals("pepperoni")){
return new NYStylePepperoniPizza();
}else return null;
}
}
public class ChicagoPizzaStore extends PizzaStore{
Pizza createPizza(String item){
if(item.equals("cheese")){
return new ChicagoStyleCheesePizza();
}else if(item.equals("veggie")){
return new ChicagoStyleVeggiePizza();
}else if(item.equals("clam")){
return new ChicagoStyleClamPizza();
}else if(item.equals("pepperoni")){
return new ChicagoStylePepperoniPizza();
}else return null;
}
}
//抽象的Pizza类
public abstrator class Pizza{
String name; //每个pizza都有名称,面团类型,酱料类型一套佐料
String dough;
String sauce;
ArrayList toppings=new ArayList();
void prepare(){
Syetem.out.println("preparing " +name);
Syetem.out.println("Tossing dough...");
Syetem.out.println("Adding sauce...");
for(int i=0;i<toppings.size();i++){
System.out.println(" " +toppings.get(i)); //一些比萨特别的用料
}
}
void bake(){
System.out.println("Bake for 25 minutes at 350");
}
void cut(){
System.out.println("Cutting the pizza into diagonal slices");
}
void box(){
System.out.pringln("Place pizza in official PizzaStore box");
}
public String getName(){
return name;
}
}
//具体子类
public class NyStyleCheesePizza exteds Pizza{
public NYStyleCheesePizza(){
name="NY Style Sauce and Cheese Pizza";
dough="Thin Crust Dough";
sauce="Marinara Sauce";
toppings.add("Grated Reggiano Cheese");
}
}
public class ChicagoStyleCheesePizza extends Pizza{
public ChicagoStyleCheesePizza(){
name="Chicago sty;e Deep Dish Cheese Pizza";
dough="Extra Thick Crust Dough";
sauce="Plum Tomato Sauce";
toppings.add("Shredded Mozzarella cheese"); //在构造器里面覆盖属性
}
void cut(){
System.out.println("Cutting the pizza into square slices");
} //在外面覆盖方法
}
public class pizzaTestDrive{
public static void main(String[] args){
PizzaStore nyStore=new NYPizzaStore();
PizzaStore chicagoStore=new ChicagoPizzaStore();
Pizza pizza=nyStore.orderPizza("cheese");
System.out.println("Ethan ordered a "+pizza.getName()+"/n");
pizza=chicagoStore.orderPizza("cheese");
System.out.println("Joel ordered a "+pizza.getName()+"/n");
}
}
//抽象工厂
//重做比萨
public abstract class pizza{
String name;
Dough dough;
Sauce sauce;
Veggies veggies[];
Cheese cheese;
Pepperoni pepperoni;
Clams clam;
abstract void prepare(); //将prepare定义成抽象的
void bake(){
System.out.println("Bake for 25 minutes at 350");
}
void cut(){
System.out.println("Cutting the pizza into diagonal slices");
}
void box(){
System.out.println("Place pizza in official PizzaStore box");
}
void setName(String name){
this.name=name;
}
String getName(){
return name;
}
public String toString(){
//打印比萨的代码
}
}
public class CheesePizza extends Pizza{
PizzaIngredientFactory ingredientFactory;
public CheesePizza(PizzaIngredientFactory ingredientFactory){
this.ingredientFactory=ingredientFactory;
}
void prepare(){
System.out.println("Preparing "+name);
dough=ingredientFactory.createDough();
sauce=ingredientFactory.createSauce();
cheese=ingredientFactory.createCheese();
}
}
public class ClamPizza extends Pizza{
PizzaIngredientFactory ingredientFactory;
public ClamPizza(PizzaIngredientFactory ingredientFactory){
this.ingredientFactory=ingredientFactory;
}
void prepare(){
System.out.println("Preparing "+name);
dough=ingredientFactory.createDough();
sauce=ingredientFactory.createSauce();
cheese=ingredientFactory.createCheese();
clam=ingredientFactory.createClam();
}
}
//创建原料工厂
public interface PizzaIngredientFactory{
public Doubh createDough();
public Sauce createSauce();
public Cheese createCheese();
public Veggies[] createVeggies();
public Clams createClam();
}
//纽约原料工厂的实现
public class NYPizzaIngredientFactory implements PizzaIngredientFactory{
public Dough createDough(){
return new ThinCrustDough();
}
public Sauce createSauce(){
return new MarinaraSauce();
}
public Cheese createCheese(){
return new ReggianoCheese();
}
public Veggies[] createVeggies(){
Veggies veggies[]={new Garlic(),new Onion(),new Mushroom(),new REdRepper() };
return veggies;
}
public Pepperoni createPepperoni(){
return new SlicedPepperoni();
}
public Clams createClam(){
return new FreshClams();
}
}
//抽象的比萨店
public abstract class PizzaStore{
public Pizza orderPizza(String type){
Pizza pizza=null;
pizza=createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(String type); //实例化比萨的责任被移到一个“方法”中,此方法就如同是一个工厂
}
//比萨店
public class NYPizzaStore extends PizzaStore{
protecated Pizza createPizza(String item){
Pizza pizza=null;
PizzaIngreidentFactory ingredientFactory=new NYPizzaIngredientFactory();
if(item.equals("cheese")){
pizza=new CheesePizza(ingredientFactory); //把工厂传递给每一个比萨,以便比萨能从工厂中取得原料
pizza.setName("New York Style Cheese Pizza");
}else if(item.equals("veggie")){
pizza=new VeggiePizza(ingredientFactory);
pizza.setName("New York Style Veggie Pizza");
}else if(item.equals("clam")){
pizza=new ClamPizza(ingredientFactory);
pizza.setName("New York Style Clam Pizza"); //对于每一种比萨我们实例化一个新的比萨,并传进该种比萨所需的工厂。
}else if(item.equals("pepperoni")){
pizza=new PepperoniPizza(ingredientFactory);
pizza.setName("New York Style Pepperoni Pizza");
}
return pizza;
}
}