java工厂设计模式

java工厂设计模式

ID:39968934

大小:1.16 MB

页数:50页

时间:2019-07-16

java工厂设计模式_第1页
java工厂设计模式_第2页
java工厂设计模式_第3页
java工厂设计模式_第4页
java工厂设计模式_第5页
资源描述:

《java工厂设计模式》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、TheFactoryPattern(工厂模式)学习问题随着经济的全球化,一个软件可能要在全球销售。因此,我们设计的软件应该能够通过简单的配置就可以适应不同的国家。本讲所学的知识将能提供一种有助于解决此问题的方法。对象创建问题…关于new:按照面向抽象的设计原则,我们应该面向接口编程而不是面向实现编程。但是我们每次使用new时,是不是正在违背这一原则呢?我们想用接口但却必须建立一个具体类的实例Duckduck=newMallardDuck()问题…当你拥有一组相关的具体类时,你常常被迫写出类似下面的代码:Duckduck;If(

2、picnic){duck=newMallardDuck();}elseif(hunting){duck=newDecoyDuck();}elseif(inBathTub){duck=newRubberDuck();}这样做的原因是直到运行时我们才知道需要实例化那个类。这样做的后果是如果应用要做变化或扩展,往往要修改这段代码。这使得维护困难并容易引入错误。问题在哪里?是new的问题吗?从技术上来说,new并没有任何问题。new是java最基本的部分。真正的问题在于“变化”如果对接口编程,我们可实现与许多“变化”的隔离,因为通过多

3、态机制,你的代码对于实现接口的新类依然适用。但是使用具体类麻烦就来了,因为增加新的具体类时相应代码可能就必须修改。怎么办呢?Duckduck=newMallardDuck()上面这段代码所在的模块与MallardDuck模块形成了耦合。再回忆我们前面提出的面向对象设计的原则识别应用的变化部分,并将之与固定的部分相分离。区分变化的部分下面我们来看一个例子Pizza店披萨PizzaStore类中的一段代码-订做pizzaPublicClassPizzaStore{//…PizzaorderPizza(){Pizzapizza=ne

4、wPizza();pizza.prepare();pizza.bake();pizza.cut();pizza.box();returnpizza;}//…}真希望这是一个抽象类或者接口,可惜抽象类或接口都不能被实例化而且,我们有许多种pizza,所以我们增加一些代码,来确定合适的pizza种类,然后进行制作。修改后的代码PizzaorderPizza(Stringtype){Pizzapizza;if(type.equals(“cheese”)){pizza=newCheesePizza();}elseif(type.equ

5、als(“greek”)){pizza=newGreekPizza();}elseif(type.equals(“pepperoni”)){pizza=newPepperoniPizza();}pizza.prepare();pizza.bake();pizza.cut();pizza.box();returnpizza;}根据接受的类型,创建相应的pizza实例,并赋值给实例变量。(注意:各种pizza实现接口Pizza)传递pizza的类型给方法orderPizza每一种pizza子类型都知道其制作方法由于市场竞争。。。其

6、他pizza店推出了新产品,我们也得增加!例如VeggiePizza。GreekPizza最近不受欢迎,把它从菜单中取消。于是。。。改!改!改!PizzaorderPizza(Stringtype){Pizzapizza;if(type.equals(“cheese”)){pizza=newCheesePizza();}elseif(type.equals(“greek”)){pizza=newGreekPizza();}elseif(type.equals(“pepperoni”)){pizza=newPepperoniPi

7、zza();}elseif(type.equals(“veggie”)){pizza=newVeggiePizza();}pizza.prepare();pizza.bake();pizza.cut();pizza.box();returnpizza;}变与不变变与不变PizzaorderPizza(Stringtype){Pizzapizza;if(type.equals(“cheese”)){pizza=newCheesePizza();}elseif(type.equals(“greek”)){pizza=newGree

8、kPizza();}elseif(type.equals(“pepperoni”)){pizza=newPepperoniPizza();}elseif(type.equals(“veggie”)){pizza=newVeggiePizza();}pizza.prepare(

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。