- 1、本文档共55页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1
有关对象创建-new
按照前面介绍的设计原则,我们应该面向接口编程而不是面向实现编程,因为面向实现编程会使得我们的设计更脆弱,缺乏灵活性。
但是我们每次使用new时,是不是正在违背这一原则呢?
我们想用接口
但却必须建立一个具体类的实例
Duck duck = new MallardDuck()
Pizza Factory
2
问题…
当你拥有一组相关的具体类时,你常常被迫写出类似下面的代码:
Duck duck;
If (picnic) {
duck=new MallardDuck();
} else if (hunting) {
duck=new DecoyDuck();
} else if (inBathTub) {
duck=new RubberDuck();
}
这样做的原因是直到运行时我们才知道需要实例化那个类。
这样做的后果是如果应用要做变化或扩展,往往要修改这段代码。这使得维护困难并容易引入错误。
Pizza Factory
3
问题在哪里?是new的问题吗?
从技术上来说,new并没有任何问题。new是java最基本的部分。那么问题在哪里?
真正的问题在于“变化”
如果对接口编程,我们可实现与许多“变化”的隔离,因为通过多态机制,你的代码对于实现接口的新类依然适用。
但是使用具体类麻烦就来了,因为增加新的具体类时相应代码可能就必须修改。
Pizza Factory
4
Pizza
Pizza Factory
5
Pizza 的生产过程
Pizza store的主要步骤
客户点pizza
准备pizza原料,制作一个生的pizza
烘烤
切割成块
Pizza装盒
为客户呈上pizza成品
Pizza Factory
6
Pizza store-orderPizza方法
Public Class PizzaStore {
//…other code
Pizza orderPizza() {
Pizza pizza = new Pizza();
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
//…other code
}
为了让系统有弹性,希望这是一个抽象类或者接口,可惜抽象类或接口都不能被实例化
而且,我们有许多种pizza,所以我们增加一些代码,来确定合适的pizza种类,然后进行制作。
Pizza Factory
7
pizza种类扩展后的类图
Pizza Factory
8
修改后的代码
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实例,并赋值给实例变量。(注意:各种pizza实现接口Pizza)
传递pizza的类型给方法orderPizza
每一种pizza子类型都知道其制作方法
Pizza Factory
9
适应市场,改变pizza种类
其他pizza店推出了新产品,我们也得增加!例如VeggiePizza。
GreekPizza最近不受欢迎,把它从菜单中取消。
于是…
Pizza Factory
10
修改代码
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 Ve
您可能关注的文档
- 09破译遗传密码幻灯片.ppt
- 9胸痹心痛短气病脉证并治第九课件.ppt
- 09-循环系统幻灯片.ppt
- 10 内分泌系统幻灯片.ppt
- 10.第十章 激励课件.ppt
- 10.抗生素2幻灯片.ppt
- 10第十节 急性呼吸窘迫综合征病人的护理课件.ppt
- 11 Brunnstrom技术课件.ppt
- 11 分枝杆菌属幻灯片.ppt
- 11.13破伤风幻灯片.ppt
- 2023年湖北省孝感市孝昌县丰山镇阳岗(社区工作人员)自考复习100题模拟考试含答案.pdf
- 计算机图形图像制作专业人才培养方案及对策.pdf
- 钢筋工程承包的协议书范文(标准版).pdf
- 纪检监察常用文件格式及范例.pdf
- 社会资本办专科医疗机构手术机器人配置评审总体评分表【医院乙类大型医用设备配置评审总体评分表】2019.pdf
- 2023年四川省广安市华蓥市高兴镇(社区工作人员)自考复习100题模拟考试含答案.pdf
- 苏州市2024-2025学年七年级上学期开学分班模拟考试语文试题.pdf
- 股份公司合作协议书范文3篇.pdf
- 老河口2022年中学教师招聘考试真题及答案解析卷1.pdf
- 2023危货驾驶员、押运员岗位考核试题.pdf
文档评论(0)