(工厂模式).pptVIP

  • 4
  • 0
  • 约 44页
  • 2017-08-11 发布于河南
  • 举报
The Factory Pattern (工厂模式) 学习问题 随着经济的全球化,一个软件可能要在全球销售。因此,我们设计的软件应该能够通过简单的配置就可以适应不同的国家。 本讲所学的知识将能提供一种有助于解决此问题的方法。 对象创建问题… 关于new: 按照前面介绍的设计原则,我们应该面向接口编程而不是面向实现编程,因为面向实现编程会使得我们的设计更脆弱,缺乏灵活性。但是我们每次使用new时,是不是正在违背这一原则呢? 问题… 当你拥有一组相关的具体类时,你常常被迫写出类似下面的代码: Duck duck; If (picnic) { duck=new MallardDuck(); } else if (hunting) { duck=new DecoyDuck(); } else if (inBathTub) { duck=new RubberDuck(); } 问题在哪里?是new的问题吗? 从技术上来说,new并没有任何问题。new是java最基本的部分。真正的问题在于“变化” 如果对接口编程,我们可实现与许多“变化”的隔离,因为通过多态机制,你的代码对于实现接口的新类依然适用。但是使用具体类麻烦就来了,因为增加新的具体类时相应代码可能就必须修改。 怎么办呢? 再回忆我们前面提出的面向对象设计的原则 识别应用的变化部分,并将之与固定的部分相分离。 区分变化的部分 下面我们来看一个例子 Pizza店 PizzaStore类中的一段代码-订做pizza Public Class PizzaStore { //… Pizza orderPizza() { Pizza pizza = new Pizza(); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } //… } 修改后的代码 Pizza orderPizza(String type) { Pizza pizza; if (type.equals(“cheese”)){ pizza = new CheesePizza(); } else if (type.equals(“greek”)){ pizza = new GreekPizza(); } else if (type.equals(“pepperoni”)){ pizza = new PepperoniPizza(); } pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } 由于市场竞争。。。 其他pizza店推出了新产品,我们也得增加!例如VeggiePizza。 GreekPizza最近不受欢迎,把它从菜单中取消。 于是。。。 改!改!改! Pizza orderPizza(String type) { Pizza pizza; if (type.equals(“cheese”)){ pizza = new CheesePizza(); } else if (type.equals(“greek”)){ pizza = new GreekPizza(); } else if (type.equals(“pepperoni”)){ pizza = new PepperoniPizza(); } else if (type.equals(“veggie”)){ pizza = new VeggiePizza(); } pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } 变与不变 Pizza orderPizza(String type) { Pizza pizza; if (type.equals(“cheese”)){ pizza = new CheesePizza(); } else if (type.equals(“greek”)){ pizza = new GreekPizza(); } else if (type.equals(“pepperoni”)){ pizza = new PepperoniPizza(); } else if (type.equals(“vegg

文档评论(0)

1亿VIP精品文档

相关文档