第二章 2工厂模式.ppt_第1页
第二章 2工厂模式.ppt_第2页
第二章 2工厂模式.ppt_第3页
第二章 2工厂模式.ppt_第4页
第二章 2工厂模式.ppt_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、信息系统分析与设计,1/26,2011年3月,信息系统分析与设计第二章 设计模式,FactoryMethod模式,综合例子,Mobile.java public interface Mobile public void call (); Nokia.java public class Nokia implements Mobile public void call () System.out.println(“Nokia Mobile”); Motorola.java public class Motorola implements Mobile public void call () Sys

2、tem.out.println(“Motorola Mobile”); ,综合例子2,MobileFactory.java public class MobileFactory public Mobile getMobile (String title) throws Exception if(title.equlasIgnoreCase(“nokia”) return new Nokia(); else if (title.equalsIgnoreCase(“motorola”) return new Motorola(); else throws new Exception (“no su

3、ch mobile”); ,综合例子3,SimpleFactoryClient.java public class SimpleFactoryClient public static void main(String args) try MobileFactory mf=new MobileFactory(); Mobile m; m=mf.getMobile(“nokia”); m.call(); m=mf.getMobile(“motorola”); m.call(); catch(Exception e)e.printStackTrace(); ,信息系统分析与设计,5/26,2011年

4、3月,工厂模式,意图 定义一个创建对象的接口,但由其子类决定实例化哪个类,工厂方法将类的实例化延迟到子类 问题 一个类需要实例化另外一个类的子类,但不知是哪一个,工厂模式允许子类进行决策 解决方案 子类对实例化哪个类以及如何实例化作出决策,信息系统分析与设计,6/26,2011年3月,参与者与协作者 Product是工厂方法所创建的对象类型的接口,Creator是定义工厂方法的接口 效果 客户将需要继承Creator,以创建特定的concreteProduct对象 实现 在抽象类中使用一个抽象方法。需要实例化一个被包含对象的时候抽象类的代码将引用此方法,但不知道需要的对象是哪一个。,信息系统分

5、析与设计,7/26,2011年3月,一般结构图 Creator f = new ConcreteCreator(); Product p = f.factoryMethod();,Creator f = new ConcreteCreator(); Product p = f.factoryMethod();,信息系统分析与设计,9/26,2011年3月,一般结构图,信息系统分析与设计,10/26,2011年3月,举例,假设完成一个银行管理信息系统时需要一个Bank类,可以创建SavingAccount和CreditAccount两种类型的帐户,而SavingAccount和CreditAcc

6、ount账户的大部分操作是相同的,可以继承同一个父类Account。现在编写具体的银行IcbcBank试类及测试类Client,利用FactoryMethod模式,实现创建不同类型的账户。,public class Bank public Account createAccount(String type) /该方法具体实现根据type类型不同创建不同的账户 public abstract void addUser(Account acc); public abstract Vector getUsers(); public class IcbcBank extends Bank /维护保存账

7、户集合信息 ,public abstract class Account public class SavingAccount extends Account public SavingAccount() System.out.println(“create saving account”); public class CreditAccount extends Account public CreditAccount() System.out.println(“create credit account”); ,import java.util.*; public class Test pu

8、blic static void main(String args) Bank bank=new IcbcBank(); Account acc1=bank.createAccount(“1”); Account acc2=bank.createAccount(“2”); bank.addUser(acc1); bank.addUser(acc2); System.out.println(output all users information); Iterator it=(bank.getUsers().iterator(); while(it.hasNext() System.out.pr

9、intln(it.next(); ,信息系统分析与设计,14/26,2011年3月,输出结果: create saving account create credit account output all users information bankfactory.SavingAccount15ff48b bankfactory.CreditAccountaffc70,信息系统分析与设计,15/26,2011年3月,练习,示例中无法区分建立帐号的唯一性,请在Account类中加上帐号的流水号码和类型属性;同时为了保证只有一个银行类实例,在IcbcBank类中引入单例模式,并产生唯一的流水号码。

10、仿照GenerateID类方法。 思考:此处为什么不在Bank类中引入单例模式?,public class Bank public Account createAccount(String type,int serial) Account acc=null; if (type.equals(“1”) acc = new SavingAccount(type,serial); else if (type.equals(“2”) acc = new CreditAccount(type,serial); return acc; public abstract void addUser(Accoun

11、t acc); public abstract Vector getUsers(); ,public class IcbcBank extends Bank Vector users=new Vecotr(); private int serial=100; public void addUser(Account acc) users.add(acc); public Vector getUsers() return users; private IcbcBank() private static IcbcBank icbc=new IcbcBank(); public static Icbc

12、Bank getInstance() return icbc; public int getSerial() return serial+; ,public class Account private int serial; private String type; public int getSerial() return serial; public Account(String type,int serial) this.type=type; this.serial=serial; public void setSerial(int s) this.serial=s; public cl

13、ass SavingAccount extends Account public SavingAccount(String type,int s) super(type,s); public class CreditAccount extends Account public CreditAccount(String type,int s) super(type,s); ,import java.util.*; public class Test public static void main(String args) IcbcBank bank=IcbcBank.getInstance();

14、 Account acc1=bank.createAccount(1,bank.getSerial(); Account acc2=bank.createAccount(2,bank.getSerial(); bank.addUser(acc1); bank.addUser(acc2); System.out.println(output all users information); Iterator it=(bank.getUsers().iterator(); while(it.hasNext() System.out.println(Account id=+ (Account)it.next().getSerial(); ,信息系统分析与设计,20/26,2011年3月,输出结果: output all users information Account id=100 Account id=101 Account id=102 Account id=103,信息系统分析与设计,21/26,2011年3月,作业,示例中是根据类型生产不同的产品,修改为根据传入的类名生产产品,减少对具体类的依赖 在上述代码基础上,实现构造方法带参数,信息系统分析与设计,22/26,2011年3月,优点 E

温馨提示

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

最新文档

评论

0/150

提交评论