java工厂设计模式课件_第1页
java工厂设计模式课件_第2页
java工厂设计模式课件_第3页
java工厂设计模式课件_第4页
java工厂设计模式课件_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、工厂模式,学习问题,随着经济全球化,一个软件可能会销往世界各地。因此,我们设计的软件应该能够通过简单的配置适应不同的国家。本次讲座学到的知识将提供一种帮助解决这个问题的方法。根据面向抽象的设计原则,我们应该面向接口编程而不是实现编程。但是每次我们使用新的,我们是否违反了这个原则?我们想要使用这个接口,但是我们必须创建一个具体类的实例,Duck duck=new MallardDuck(),问题.当您有一组相关的具体类时,您经常被迫编写如下代码:Duck duckIf(野餐) duck=new MallardDuck();否则,如果(狩猎) duck=新DeCoydUck();否则,如果(在桶中

2、) duck=新橡胶桶();因为我们直到运行时才知道该类需要实例化。其结果是,如果应用程序需要更改或扩展,通常需要修改这段代码。这使得维护变得困难,并且容易引入错误。问题在哪里?这是新的问题吗?从技术上讲,新的没有错。新是java最基本的部分。真正的问题在于“变化”。如果我们对接口编程,我们可以将它与许多“变化”隔离开来,因为您的代码仍然适用于通过多态机制实现接口的新类。但是使用具体类的麻烦来了,因为当添加新的具体类时,相应的代码可能必须被修改。怎么办?Duck duck=新的MallardDuck()上面代码所在的模块与MallardDuck模块耦合。然后回顾我们提出的面向对象设计的原理,识

3、别应用程序的变化部分,并将其与固定部分分开。为了区分变化的部分,让我们看一个比萨饼店、比萨饼店、比萨饼店、公共类比萨饼店/比萨饼店订购比萨饼()比萨饼=新比萨饼()中的代码示例。pizza.prepare()pizza . bake();pizza . cut();pizza . box();退回比萨饼;/.,我真的希望这是一个抽象类或接口,但不幸的是,抽象类和接口都不能被实例化。此外,我们有多种比萨饼,所以我们添加一些代码来确定合适的比萨饼类型,然后制作它。修改代码,比萨饼订购比萨饼(字符串类型)比萨饼比萨饼;if (type.equals(“奶酪”) PIzza=new CHIES PIz

4、za();否则,如果(type.equals(“希腊语”) pizza=new GreekPizza();否则,如果(type . equals( pepper oni ) pizza=new pepper onipizza(); pizza.prepare()pizza . bake();pizza . cut();pizza . box();退回比萨饼;,根据接受的类型,创建相应的pizza实例并将其分配给实例变量。(注意:各种比萨饼实现了界面比萨饼),并将比萨饼的类型传递给方法orderPizza。由于市场竞争,每一种比萨饼都知道它的生产方法。其他比萨饼店已经推出了新产品,所以我们必须增

5、加他们!例如蔬菜比萨。GreekPizza最近不流行,所以从菜单中取消它。所以。改变。改变!改变!比萨饼订单比萨饼(字符串类型)比萨饼比萨饼;if (type.equals(“奶酪”) PIzza=new CHIES PIzza();否则,如果(type.equals(“希腊语”) pizza=new GreekPizza();否则,如果(type . equals( pepper oni ) pizza=new pepper onipizza();否则,如果(type . equals( veggie ) pizza=new veggie pizza(); pizza.prepare()pi

6、zza . bake();pizza . cut();pizza . box();退回比萨饼;、变化和不变、变化和不变、比萨饼订购比萨饼(字符串类型)比萨饼比萨饼;if (type.equals(“奶酪”) PIzza=new CHIES PIzza();否则,如果(type.equals(“希腊语”) pizza=new GreekPizza();否则,如果(type . equals( pepper oni ) pizza=new pepper onipizza();否则,如果(type . equals( veggie ) pizza=new Veggie pizza(); pizza.

7、prepare()pizza . bake();pizza . cut();pizza . box();退回比萨饼;,这是变化的一部分。随着比萨菜单的改变,这一部分应该不断地改变。这部分是同一个部分。,分离,比萨饼订购比萨饼(字符串类型)比萨饼比萨饼;if (type.equals(“奶酪”) PIzza=new CHIES PIzza();否则,如果(type.equals(“希腊语”) pizza=new GreekPizza();否则,如果(type . equals( pepper oni ) pizza=new pepper onipizza();否则,如果(type . equal

8、s( veggie ) pizza=new Veggie pizza(); pizza.prepare()pizza . bake();pizza . cut();pizza . box();退回比萨饼;,将这一部分封装在一个只关心如何创建比萨饼的对象中。等于(“奶酪”)比萨饼=新奶酪比萨饼();否则,如果(type.equals(“希腊语”) pizza=new GreekPizza();否则,如果(type . equals( pepper oni ) pizza=new pepper onipizza();否则,如果(type . equals( veggie ) pizza=new V

9、eggie pizza();,将创建比萨对象的代码与orderPizza方法分开,并专门制作比萨对象。我们将该对象称为专门制作比萨饼比萨饼比萨饼的比萨饼工厂,比萨饼订购比萨饼(字符串类型)比萨饼比萨饼;pizza.prepare()pizza . bake();pizza . cut();pizza . box();退回比萨饼;,比萨饼工厂,要求制作比萨饼,比萨饼,所以订购比萨饼的方法成为比萨饼工厂的顾客。匹萨工厂-simplepizzaffactory,公共类simplepizzafactory 公共匹萨创建匹萨(字符串类型)匹萨匹萨=nullif (type.equals(“奶酪”) PI

10、zza=new CHIES PIzza();否则,如果(type . equals( pepper oni ) pizza=new pepper onipizza();否则,如果(type . equals( veggie ) pizza=new veggie pizza();退回比萨饼;,比萨工厂定义了“生产”比萨的方法。所有客户都可以用它来实例化新的比萨对象,这部分代码是从orderPizza()方法中提取的。像最初的方法一样,比萨饼的类型由参数决定。想想吧!似乎我们只是把问题从一个对象推到了另一个对象上!这样做有什么好处?您可以将客户代码(PizzaStore)与特定的Pizza分离开来

11、。Simplesizafactory可以有许多客户,所以当实现改变时,我们只需要修改Simplesizafactory,而不是修改许多客户。提高聚合度,比萨店的职责是使用比萨对象,而简单比萨工厂的职责是决定创建哪种比萨对象。重写PizzaStore类,公共类pizzastore simplesizafactory公共比萨店(简单比萨工厂) this.factory=工厂;公共比萨饼订单比萨饼(字符串类型)比萨饼比萨饼;比萨=工厂.创建比萨(类型);pizza.prepare()pizza . bake();pizza . cut();pizza . box();退回比萨饼;/此处的其他方法、工

12、厂方法模式、Pizza可以是抽象类或接口。有些人认为这不是真正的模式,而是编程的习惯。授权比萨店我们的比萨店非常成功,很多人想开我们的授权特许店。然而,不同地区的特许比萨饼店可能希望提供不同口味的比萨饼。如何解决这个问题?其中一个解决方案是建立不同的工厂,如纽约比萨工厂、芝加哥比萨工厂、加利福尼亚比萨工厂,并在比萨店里包括相应工厂的例子。代码类似:/匹萨店提供纽约风格的匹萨工厂nyfactory=new nypizza factory();/建立一个生产纽约风味比萨的工厂,pizza shop ny store=new pizza shop(ny factory);/开一家比萨饼店,并向纽约式

13、比萨饼工厂nystore . order pizza(“Veggie”)报价;/它生产纽约风味的比萨饼。/这家比萨饼店提供带有芝加哥风味的比萨饼。芝加哥工厂=新芝加哥比萨饼工厂();比萨店芝加哥商店=新比萨店(芝加哥工厂);芝加哥商店。抽象工厂,有这么多工厂,所以我们可以添加一个抽象层一起设计,另一个解决方案工厂方法模式,思考:重写比萨,把createPizza()方法放回比萨,但声明它是一个抽象方法,然后创建一个比萨的子类每个地方风味。,改造后的比萨店的代码,公共抽象类比萨店公共比萨饼订单比萨饼(字符串类型)比萨饼=创建比萨饼(类型);准备比萨饼。烘焙();披萨。cut();披萨。方框();退回比萨饼;抽象比萨创建比萨(字符串类型);,在比萨店内调用自身的一个方法来制造披萨,而不是使用一个工厂对象工厂对象成了这里的一个抽象方法,下面我们需要比萨店的各种子类(对应不同的地区风味),让子类做决定,芝加哥比萨店,创建比萨(),比萨创建比萨(字符串项) if (item.equals(奶酪)返回新的NystyleCheesPizza();否则如果(item.equals(蔬菜)返回新的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论