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

简单工厂,工厂,抽象工厂相关推荐

  1. 设计模式--简单工厂VS工厂VS抽象工厂

    前几天我一直在准备大学毕业生,始终绑起来,如今,终于有时间去学习设计模式.我们研究今天的话题是植物三口之家的设计模式的控制--简单工厂VS工厂VS抽象工厂. 经过细心推敲,我们不难得出:工厂模式是简单 ...

  2. 创建型模式:工厂模式(简单工厂+工厂方法+抽象工厂)

    一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!& ...

  3. Head First设计模式读书笔记四 简单工厂 工厂模式 抽象工厂模式

    本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: 工厂模式 https://blog.csdn.net/u011109881/article/details/56541580 ...

  4. 简单工厂、工厂、抽象工厂

    简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.它又称为静态工厂方法模式,属于类的创建型模式. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪 ...

  5. 简单工厂和抽象工厂有什么区别?

    简单工厂和抽象工厂有什么区别? 简单工厂模式 是由一个工厂对象创建产品实例,简单工厂模式的工厂类一般是使用静态方法,通过不同的参数的创建不同的对象实例 可以生产结构中的任意产品,不能增加新的产品 抽象 ...

  6. 简单工厂-工厂方法-抽象工厂

    目录 简单工厂 工厂方法 抽象工厂 前言 之前看书认真了解过这三种模式,但因为没有做记录,都给忘完了.现在重新分析网上的博客发现跟书里讲的不太一样,哎-.现在能做的就是把现在的理解给记录一下,若以后有 ...

  7. 简单工厂 工厂方法 抽象工厂 如何理解

    文章目录 前言 一.简单工厂 二.工厂方法 三.抽象工厂 总结 前言 简单工厂,工厂方法,抽象工厂,三者有什么区别? 搞清楚他们有什么弊端,以发展的角度去观察,理解会更加深入. 提示:以下是本篇文章正 ...

  8. 从DRP架构进行简单工厂代替抽象工厂的SWOT分析

    一.前情回顾 1.简单工厂 VS 工厂方法VS抽象工厂: [简单工厂 VS 工厂方法VS抽象工厂](http://blog.csdn.net/wangyy130/article/details/248 ...

  9. 设计模式:简单工厂、工厂、抽象工厂

    2014年读过有关设计模式的书籍,当时在写C#程序,很受益. 可惜,当时没有再深入.仔细地研读和总结,后面基本上没有写代码了,也就没有看了. 去年开始学习使用PHP,需要把这一块认真地捡起来了. 虽然 ...

  10. java 三种工厂模式(简单工厂+工厂方法+抽象工厂)

    一.简单工厂模式 概述   简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的 实例,被创建的实例通常都具有共同的父类.因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因 ...

最新文章

  1. 史上首次,强化学习算法控制核聚变登上Nature:DeepMind让人造太阳向前一大步...
  2. JavaWeb学习总结(一)——JavaWeb开发入门(转载)
  3. TypeScript 类型兼容
  4. Ryu oslo学习总结
  5. html表单自动提交表单提交表单数据类型,表单
  6. 登录时记住用户名和密码及cookie案例应用
  7. ReSIProcate环境搭建
  8. anguarjs 上传图片预览_JS控制上传图片个数,预览上传图片
  9. Objective-C与Swift下的自定义打印函数(Debug和Release)
  10. 华为平板解锁工具_华为平板M6 10.8英寸首发评测 办公+影音+智能全面开花
  11. python+opencv修改像素值、创建图像
  12. js获取不同时区时间
  13. 【Python编程】《Python学习手册》思维导图
  14. docker2-镜像原理及创建新的镜像
  15. 沪江网校前端架构漫谈
  16. java泛型 方法返回值带有泛型 <T>
  17. nonebot2调用文本API发送随机文本
  18. xcconfig编写指南
  19. sklearn中warm_start参数的作用详解
  20. poj 3525 多边形内核,缩进

热门文章

  1. 自己搭服务器 做购物网站成本,从零搭建一个购物网站,实操经验
  2. 数据库的备份与恢复(一)
  3. php导出excel 细边框,phpexcel设置边框不全或者只有竖线问题解决 方法
  4. 高通Camera数字成像系统简介
  5. 硬件开发者之路之运放共模电压的解释
  6. ab测试时结果显示大量Request failed的情况分析
  7. 如何转换字体为手写体?艺术字体在线生成器怎么用?
  8. cytoscape.js在vue项目中的安装及案例
  9. 瑞神要考研(山东科技大学第四届ACM校赛)
  10. 学机器视觉好找工作吗?人工智能机器视觉方向怎么样?