




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、java工厂设计模式The Factory Pattern(工厂模式)java工厂设计模式学习问题n随着经济的全球化,一个软件可能要在全球销售。因此,我们设计的软件应该能够通过简单的配置就可以适应不同的国家。n本讲所学的知识将能提供一种有助于解决此问题的方法。java工厂设计模式对象创建问题n关于new:n按照面向抽象的设计原则,我们应该面向接口编程而不是面向实现编程。但是我们每次使用new时,是不是正在违背这一原则呢?我们想用接口但却必须建立一个具体类的实例Duck duck = new MallardDuck()java工厂设计模式问题n当你拥有一组相关的具体类时,你常常被迫写出类似下面的
2、代码:Duck duck;If (picnic) duck=new MallardDuck(); else if (hunting) duck=new DecoyDuck(); else if (inBathTub) duck=new RubberDuck();这样做的原因是直到运行时我们才知道需要实例化那个类。这样做的后果是如果应用要做变化或扩展,往往要修改这段代码。这使得维护困难并容易引入错误。java工厂设计模式问题在哪里?是new的问题吗?n从技术上来说,new并没有任何问题。new是java最基本的部分。真正的问题在于“变化”n如果对接口编程,我们可实现与许多“变化”的隔离,因为通过
3、多态机制,你的代码对于实现接口的新类依然适用。但是使用具体类麻烦就来了,因为增加新的具体类时相应代码可能就必须修改。java工厂设计模式怎么办呢?nDuck duck = new MallardDuck()n上面这段代码所在的模块与MallardDuck模块形成了耦合。java工厂设计模式再回忆我们前面提出的面向对象设计的原则 识别应用的变化部分,并将之与固定的部分相分离。java工厂设计模式区分变化的部分下面我们来看一个例子Pizza店java工厂设计模式披萨java工厂设计模式PizzaStore类中的一段代码-订做pizzaPublic Class PizzaStore /Pizza o
4、rderPizza() Pizza pizza = new Pizza(); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza;/真希望这是一个抽象类或者接口,可惜抽象类或接口都不能被实例化而且,我们有许多种pizza,所以我们增加一些代码,来确定合适的pizza种类,然后进行制作。java工厂设计模式修改后的代码Pizza orderPizza(String type) Pizza pizza; if (type.equals(“cheese”) pizza = new CheesePizza(); e
5、lse 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实例,并赋值给实例变量。(注意:各种pizza实现接口Pizza)传递pizza的类型给方法orderPizza每一种pizza子类型都知道其制作方法java工厂设计模式由于市场竞争。n
6、其他pizza店推出了新产品,我们也得增加!例如VeggiePizza。nGreekPizza最近不受欢迎,把它从菜单中取消。n于是。java工厂设计模式改!改!改!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(); e
7、lse if (type.equals(“veggie”) pizza = new VeggiePizza(); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza;变与不变java工厂设计模式变与不变Pizza orderPizza(String type) Pizza pizza; if (type.equals(“cheese”) pizza = new CheesePizza(); else if (type.equals(“greek”) pizza = new GreekPizza(); els
8、e 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菜单的变化,这部分要跟着不断地变。这部分是不变的部分。java工厂设计模式分离Pizza orderPizza(String type) Pizza pizza; if (type.equal
9、s(“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;把这部分封装在一个只管如何
10、创建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对象的代码从orderPizza方法中分离出去专管制作pizza的对象java工厂设计模式我们将专管
11、制作pizza的对象叫做Pizza工厂Pizza orderPizza(String type) Pizza pizza; pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza;PizzaFactory要求制作pizzapizza这样,orderPizza方法就成为PizaFactory的客户。java工厂设计模式Pizza工厂-SimplePizzaFactorypublic class SimplePizzaFactory public Pizza createPizza(String type) Piz
12、za pizza=null; if (type.equals(“cheese”) pizza = new CheesePizza(); else if (type.equals(“pepperoni”) pizza = new PepperoniPizza(); else if (type.equals(“veggie”) pizza = new VeggiePizza(); return pizza; Pizza工厂中定义了 “生产”pizza的方法。所有客户都可以用它来实例化新的pizza对象这部分代码就是从orderPizza()方法中抽出来的。和原来的方法一样,也是通过参数确定pizz
13、a的种类。java工厂设计模式思考一下!n这看来好像我们只是把问题从一个对象推给了另一个对象!这样做有什么好处呢?n可以解除客户代码(PizzaStore)与具体Pizza的耦合。nSimplePizzaFactory可以有许多个客户,这样,当实现改变时我们只需要修改SimplePizzaFactory,而不需修改众多的客户。n提高了聚合度,PizzaStore的职责是使用pizza对象, SimplePizzaFactory的职责是决定创建什么样的pizza对象。java工厂设计模式重写PizzaStore类public class PizzaStore SimplePizzaFactory
14、 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; /other methods herejava工厂设计模式简单工厂模式PizzaStoreorderPizza()SimplePiz
15、zaFactorycreatePizza()PizzaPrepare()Bake()Cut()Box()CheesePizzaVeggiePizzaClamPizzaPepperoniPizzaPizza可以是一个抽象类,也可以是一个接口。PizzaStore1orderPizza()框架框架的对外接口java工厂设计模式简单工厂模式ClientorderProduct()SimpleFactorycreateProduct()AbstractProductmethodOfProduct()Product1Product2Product3Productn有人认为这还不是一个真正的模式,只是一种
16、程序设计的习惯。java工厂设计模式授权pizza店n我们的pizza店非常成功,许多人都想开设我们的授权加盟店。n但是,不同地区的加盟pizza店可能希望供应不同口味的pizza。怎么解决这个问题呢?java工厂设计模式解决方法之一:建立不同的工厂n建立不同的工厂:如NYPizzaFactory、 ChicagoPizzaFactory、 CaliforniaPizzaFactory,在PizzaStore中包含相应工厂的实例。其代码类似于:/该pizza店提供纽约风味的pizzaNYPizzaFactory nyFactory=new NYPizzaFactory();/建立一个生产纽约风
17、味pizza的工厂PizzaStore nyStore=new PizzaStore(nyFactory);/建立一个pizza店,引用纽约风味pizza的工厂nyStore.orderPizza(“Veggie”);/生产的是纽约风味的pizza/该pizza店提供芝加哥风味的pizzaChicagoPizzaFactory chicagoFactory=new ChicagoPizzaFactory();PizzaStore chicagoStore=new PizzaStore(chicagoFactory);chicagoStore.orderPizza(“Veggie”);java工
18、厂设计模式抽象工厂模式n这么多工厂,可以再增加抽象层n让我们一起来设计java工厂设计模式AbstractFactorycreateProduct()ConcreteFactorycreateProduct()java工厂设计模式另一种解决方法-工厂方法模式n思路:改写的PizzaStore,将createPizza()方法放回到PizzaStore,但是声明为抽象方法,然后,为每一种地方风味创建一个PizzaStore的子类。java工厂设计模式改造后的PizzaStore的代码public abstract class PizzaStore public Pizza orderPizza(
19、String type) Pizza pizza = createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; abstract Pizza createPizza(String type);在PizzaStore内调用自身的一个方法来制造pizza,而不是使用一个factory对象factory对象成了这里的一个抽象方法下面我们需要PizzaStore的各种子类(对应不同的地区风味)java工厂设计模式让子类做决定PizzaStorecreatePizza()orderP
20、izza()NYPizzaStorecreatePizza()ChicagoPizzaStorecreatePizza()Pizza createPizza(String item) if (item.equals(“奶酪奶酪) return new NYStyleCheesePizza(); else if (item.equals(“蔬菜蔬菜) return new NYStyleVeggiePizza(); else if (item.equals(“卡姆卡姆) return new NYStyleClamPizza(); else if (item.equals(“辣香肠辣香肠) re
21、turn new NYStylePepperoniPizza(); else return null; java工厂设计模式讨论:为什么说是由子类做决定的?PizzaStorecreatePizza()orderPizza()NYPizzaStorecreatePizza()ChicagoPizzaStorecreatePizza()public abstract class PizzaStore public Pizza orderPizza(String type) Pizza pizza = createPizza(type); pizza.prepare(); pizza.bake()
22、; pizza.cut(); pizza.box(); return pizza; abstract Pizza createPizza(String type);java工厂设计模式现在让我们来编写子类NYPizzaStorePizzaStorecreatePizza()orderPizza()NYPizzaStorecreatePizza()ChicagoPizzaStorecreatePizza()public class NYPizzaStore extends PizzaStore Pizza createPizza(String item) if (item.equals(“奶酪奶
23、酪) return new NYStyleCheesePizza(); else if (item.equals(“蔬菜蔬菜) return new NYStyleVeggiePizza(); else if (item.equals(“卡姆卡姆) return new NYStyleClamPizza(); else if (item.equals(“辣香肠辣香肠) return new NYStylePepperoniPizza(); else return null; java工厂设计模式怎么编写子类ChicagoPizzaStore?试试看java工厂设计模式声明工厂方法public
24、abstract class PizzaStore public Pizza orderPizza(String type) Pizza pizza = createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; abstract Pizza createPizza(String type);实例化pizza的责任现在由一个方法承担。该方法相当于一个工厂。我们称之为工厂方法。PizzaStore的子类用createPizza()方法处理对象的实例化。java工厂设计模式声明工
25、厂方法abstract Pizza createPizza(String type);abstract Product factoryMethod(String type);n工厂方法是抽象的,在一个超类中定义。必须由子类来实现。n工厂方法返回一个产品,该产品通常在其所在类的方法中定义。(如orderPizza())n工厂方法通常提供参数,用以选择一个产品的不同品种。n工厂方法将客户(超类中的方法,如PizzaStore中的orderPizza())与具体的产品相隔离。java工厂设计模式工厂方法怎么工作?n假定张三喜欢纽约风味的pizza,李四喜欢芝加哥风味的pizza。n需要相应Pizza
26、店的实例n调用orderPizza()订购想要的pizza品种ncreatePizza()被调用,并返回pizza到orderPizza()方法。n尽管不知道是什么pizza,但orderPizza()仍知道对它进行后续处理。java工厂设计模式以张三订购pizza为例nPizzaStore nyPizzaStore=new NYPizzaStore();nnyPizzaStore.orderPizza(“cheese”) n在orderPizza()方法中 Pizza pizza=createPizza (“cheese”) ;n在orderPizza()方法中 pizza.prepare(
27、); pizza.bake(); pizza.cut(); pizza.box();java工厂设计模式忘记了产品:pizza,先来个抽象的import java.util.ArrayList;public abstract class Pizza String name;String dough; /生面团String sauce;ArrayList toppings = new ArrayList();void prepare() System.out.println(Preparing + name);System.out.println(Tossing dough.);System.o
28、ut.println(Adding sauce.);System.out.println(Adding toppings: );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.println(
29、Place pizza in official PizzaStore box); public String getName() return name;java工厂设计模式再来个具体的public class NYStyleCheesePizza extends Pizza public NYStyleCheesePizza() name = NY Style Sauce and Cheese Pizza;dough = Thin Crust Dough;sauce = Marinara Sauce;toppings.add(Grated Reggiano Cheese);Marinara
30、(mariners) sauce is an Italian red sauce usually made with tomatoes, garlic, herbs (such as basil), and onionjava工厂设计模式再来个另一风味的public class ChicagoStyleCheesePizza extends Pizza public ChicagoStyleCheesePizza() name = Chicago Style Deep Dish Cheese Pizza;dough = Extra Thick Crust Dough;sauce = Plum
31、Tomato Sauce;toppings.add(Shredded Mozzarella Cheese);void cut() System.out.println(Cutting the pizza into square slices);java工厂设计模式测试主类public class PizzaTestDrive public static void main(String args) PizzaStore nyStore = new NYPizzaStore();PizzaStore chicagoStore = new ChicagoPizzaStore();Pizza piz
32、za = nyStore.orderPizza(cheese);System.out.println(“张三 ordered a + pizza.getName() + n);pizza = chicagoStore.orderPizza(cheese);System.out.println(“李四 ordered a + pizza.getName() + n);java工厂设计模式工厂方法模式中的类创建者类 The Creator classesPizzaStorecreatePizza()orderPizza()NYPizzaStorecreatePizza()ChicagoPizzaS
33、torecreatePizza()Abstract creatorConcrete creatorsjava工厂设计模式工厂方法模式中的类产品类 The Product classesPizzaNYStyleCheesePizzaChicagoStyleCheesePizzacreatePizza()NYStylePepperoniPizzaNYStyleCalmPizzaNYStyleVeggiePizzaChicagoStylePepperoniPizzacreatePizza()ChicagoStyleCalmPizzacreatePizza()ChicagoStyleVeggiePiz
34、zacreatePizza()Abstract productConcrete productsjava工厂设计模式工厂方法模式的正式定义n在类中定义一个用于创建对象的接口方法,让其子类决定实例化哪一个类。通过这种做法,使得工厂方法的客户(工厂方法的使用者)不必了解具体应该实例化哪一个类。n如:pizza = pizzaStore.orderPizza(cheese);生产出来的匹萨是纽约风味的还是芝加哥风味的取决于pizzaStore引用的是哪个PizzaStore的子类java工厂设计模式工厂方法模式的结构ProductConcreteCreatorfactoryMethod()Concr
35、eteProductCreatorfactoryMethod()anOperationjava工厂设计模式总结:Factory Method模式n意图n定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式让一个类的实例化延迟到其子类。使得对象的创建与对象的使用分离开来。n别名n虚拟构造器java工厂设计模式工厂方法模式的优点与适用场景n优点n让用户代码与特定类Product的子类ConcretProduct的代码解耦。n用户不必知道它所使用的对象是怎么创建的,只需要知道这些对象的用法即可。n适用场景n希望让用户使用某些类,但不希望与这些类形成耦合(用new)。n用户需要一个类的子类的实例,但不知道该类有哪些子类可用。java工厂设计模式工厂方法模式的好处ProductConcreteCreatorfacto
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纺织品行业创新创业指导考核试卷
- 船舶改装工程技术规范与标准更新解读考核试卷
- 报纸的突发事件报道考核试卷
- 新能源汽车维护与故障诊断(微课版)教案 4.4.1空调不制冷故障诊断与排除;4.4.2空调不制热故障的诊断与排除
- 稀土金属压延加工过程中的监控与检测手段考核试卷
- 羊饲养的可持续发展模式探索考核试卷
- 航标用电缆与连接器制造考核试卷
- 煤气化技术的能源供需平衡研究考核试卷
- 珠海三中高一下学期期中考试语文试题
- 昆明幼儿师范高等专科学校《安全与健康教育》2023-2024学年第二学期期末试卷
- 中国老年糖尿病诊疗指南(2024版)解读
- 快递驿站承包协议书
- 地坪漆专项施工方案及流程
- 2024年北京海淀区高三二模语文试题和答案
- 锑矿湿法冶金新技术
- 2024年辅警招聘考试试题库含完整答案(各地真题)
- 手术室团队协作
- 航天禁(限)用工艺目录(2021版)-发文稿(公开)
- 湖北省武汉市2024届高中毕业生四月调研考试数学试卷
- MOOC 机械设计基础-西安交通大学 中国大学慕课答案
- 烟草原料知识培训课件
评论
0/150
提交评论