简单工厂,工厂,抽象工厂

来源:互联网 发布:佳能ir2320网络驱动 编辑:程序博客网 时间:2024/04/28 21:47

//简单工厂模式
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;
  }
   
}