《第3章工厂方法模式.ppt》由会员分享,可在线阅读,更多相关《第3章工厂方法模式.ppt(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第3章工厂方法模式现在学习的是第1页,共26页简单工厂模式回顾简单工厂模式回顾 简单工厂简单工厂:根据传入的参数,决定创建哪一:根据传入的参数,决定创建哪一个产品类对象个产品类对象 所有具体产品对象的创建都放在一个类中,所有具体产品对象的创建都放在一个类中,一旦增加新的产品,一旦增加新的产品,工厂类工厂类都要被修改都要被修改 简单工厂模式违背单一职责和开放简单工厂模式违背单一职责和开放-关闭原则关闭原则现在学习的是第2页,共26页解决思路解决思路 变化点在变化点在“对象创建对象创建”根据根据“封装变化点封装变化点”,可以对简单工厂中的工厂,可以对简单工厂中的工厂类做了一个封装(类做了一个封装(
2、对象创建封装对象创建封装)使其满足单)使其满足单一职责和开一职责和开-闭原则闭原则现在学习的是第3页,共26页工厂方法模式工厂方法模式建立一个抽象工厂的基类,给每个产品建立一个工建立一个抽象工厂的基类,给每个产品建立一个工厂,该工厂继承抽象工厂,规定每个产品都有特定厂,该工厂继承抽象工厂,规定每个产品都有特定的工厂来创建的工厂来创建现在学习的是第4页,共26页工厂和产品是工厂和产品是平行平行的继承层次结构的继承层次结构工厂方法工厂方法-规模扩大,更专业规模扩大,更专业每一种产品都有专门的大师傅制作有面包每一种产品都有专门的大师傅制作有面包师,面条师,米饭师师,面条师,米饭师工厂方法模式工厂方法
3、模式现在学习的是第5页,共26页工厂方法类工厂方法类UML图图现在学习的是第6页,共26页 工厂方法类图工厂方法类图现在学习的是第7页,共26页抽象工厂接口抽象工厂接口(Creator)工厂方法模式的核心,它与应用程序无关。是工厂方法模式的核心,它与应用程序无关。是具体工厂必须继承的父类或者必须实现的接口具体工厂必须继承的父类或者必须实现的接口 包含逻辑业务的代码,由应用程序调用以创建对包含逻辑业务的代码,由应用程序调用以创建对应的具体产品对象应的具体产品对象 具体工厂类具体工厂类(Conrete Creator)现在学习的是第8页,共26页抽象产品接口抽象产品接口(Product)具体产品必
4、须继承的父类或必须实现的接口具体产品必须继承的父类或必须实现的接口所创建的对象就是此角色的实例所创建的对象就是此角色的实例具体产品类具体产品类(Concrete Product)现在学习的是第9页,共26页练习练习:分析图中的关系分析图中的关系现在学习的是第10页,共26页抽象工厂角色抽象工厂角色:Creator具体工厂角色具体工厂角色:BulbCreator与与TubeCreator 具体产品角色具体产品角色:BulbLight与与TubeLight 抽象产品角色抽象产品角色:Light 现在学习的是第11页,共26页示示 例例 1现在学习的是第12页,共26页public interfac
5、e Fruit void plant();/种植种植 void grow();/生长生长 void harvest();/收获收获水果产品接口水果产品接口Fruit.java现在学习的是第13页,共26页public class Apple implements Fruit private int treeAge;public void plant()System.out.println(Apple has been planted.);public void grow()System.out.println(Apple is growing.);public void harvest()Sy
6、stem.out.println(Apple has been harvested.);public int getTreeAge()return treeAge;public void setTreeAge(int treeAge)this.treeAge=treeAge;具体产品苹果具体产品苹果Apple.java现在学习的是第14页,共26页public class Grape implements Fruit private boolean seedless;/是否有籽是否有籽 public void plant()System.out.println(Grape has been p
7、lanted.);public void grow()System.out.println(Grape is growing.);public void harvest()System.out.println(Grape has been harvested.);public boolean getSeedless()return seedless;public void setSeedless(boolean seedless)this.seedless=seedless;public static void log(String msg)System.out.println(msg);具体
8、产品葡萄具体产品葡萄Grape.java现在学习的是第15页,共26页public class Strawberry implements Fruit public void plant()System.out.println(Strawberry has been planted.);public void grow()System.out.println(Strawberry is growing.);public void harvest()System.out.println(Strawberry has been harvested.);public static void log(
9、String msg)System.out.println(msg);具体产品草莓具体产品草莓Strawberry.java现在学习的是第16页,共26页public interface FruitGardener /*工厂方法工厂方法 *return 水果水果 */public Fruit factory();水果工厂接口水果工厂接口FruitGardener.java现在学习的是第17页,共26页public class AppleGardener implements FruitGardener /工厂方法工厂方法 public Fruit factory()Fruit f=new Ap
10、ple();System.out.println(“水果工厂水果工厂 (AppletGardener)成功创建一个水果:苹果!)成功创建一个水果:苹果!);return f;苹果工厂苹果工厂AppleGardener.java现在学习的是第18页,共26页public class GrapeGardener implements FruitGardener /工厂方法工厂方法 public Fruit factory()Fruit f=new Grape();System.out.println(“水果工厂水果工厂 (GrapeGardener)成功创建一个水果:葡萄!)成功创建一个水果:葡萄
11、!);return f;葡萄工厂葡萄工厂GrapeGardener.java现在学习的是第19页,共26页public class StrawberryGardener implements FruitGardener public Fruit factory()Fruit f=new Strawberry();System.out.println(“水果工厂水果工厂 (StrawberryGardener)成功创建一个水果:草莓!)成功创建一个水果:草莓!);return f;草莓工厂草莓工厂StrawberryGardener.java现在学习的是第20页,共26页public class
12、 TestApp private FruitGardener f1,f2,f3;private Fruit p1,p2,p3;private void test()/实例化水果工厂实例化水果工厂 f1=new AppleGardener();f2=new GrapeGardener();f3=new StrawberryGardener();/从水果工厂生产水果从水果工厂生产水果 p1=f1.factory();p2=f2.factory();p3=f3.factory();public static void main(String args)TestApp test=new TestApp
13、();test.test();测试类(客户端)测试类(客户端)TestApp.java现在学习的是第21页,共26页示例示例2:“快餐店快餐店”问题问题现在学习的是第22页,共26页示例示例3 移动电信运营商,具有不同的话费套餐形移动电信运营商,具有不同的话费套餐形式,如动感地带,神州行,全球通等。式,如动感地带,神州行,全球通等。不同套餐具有不同收费标准。不同套餐具有不同收费标准。现在学习的是第23页,共26页示例示例3现在学习的是第24页,共26页优点:优点:工厂可以自主决定创建何种产品对象,创建细节被工厂可以自主决定创建何种产品对象,创建细节被隐藏到具体工厂内部隐藏到具体工厂内部添加产品
14、时,只需增加新的产品类和相应的生产工添加产品时,只需增加新的产品类和相应的生产工厂,厂,无需修改无需修改原有的产品和生产工厂原有的产品和生产工厂缺点:缺点:添加产品时,给系统会带来添加产品时,给系统会带来额外开销额外开销工厂方法模式优缺点工厂方法模式优缺点现在学习的是第25页,共26页工厂方法模式使用环境工厂方法模式使用环境 如果只用一个产品类等级就可以描述所有已有如果只用一个产品类等级就可以描述所有已有的产品类的产品类,简单工厂模式简单工厂模式是很好的解决方案是很好的解决方案 当只用一个产品类等级不足以描述所有的产品当只用一个产品类等级不足以描述所有的产品类类,包括以后可能要添加的新的产品类时,就包括以后可能要添加的新的产品类时,就应当考虑采用应当考虑采用工厂方法模式工厂方法模式。由于工厂方法模式可以容许多个实的工厂类,由于工厂方法模式可以容许多个实的工厂类,以每一个工厂类负责每一个产品类等级,因此以每一个工厂类负责每一个产品类等级,因此这种模式可以容纳所有的产品等级。这种模式可以容纳所有的产品等级。现在学习的是第26页,共26页