Android开发中抽象工厂模式.docx_第1页
Android开发中抽象工厂模式.docx_第2页
Android开发中抽象工厂模式.docx_第3页
Android开发中抽象工厂模式.docx_第4页
Android开发中抽象工厂模式.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

模式解读 abstract 是“抽象”,factory 是“工厂”,所以合起来abstract factory 就是“抽象工厂”的意思。Abstract Factory Pattern 中的抽象工厂则是把各种抽象零件合成抽象产品。换句话说,处理的重点是在接口(api)而不是零件的具体实现。只利用接口(API)就能把零件组合成产品。模板方法模式和生成模式的情形 是在子类进行具体的实现,而抽象工厂模式也同样是由子类来处理具体 的实现。在子类就会出现具体工厂利用具体零件组合而成的具体产品。程序示例本篇涉及的类较多,较之单例模式而言理解真来比较难。一步步来吧。本例将使用抽象工厂,制作输出一个HTML语言显示在Android 的文本上。由于涉及类比较多,先上UML图,再一一解释:抽象零件:Item 类caption字段 是此项目的“标题”。makeHtml 方法是抽象方法,须等待子类进行实现。一旦调用 此方法时,其返回值即为HTML字符串(子类要有这样的执行功能)。代码:public abstract class Item protected String caption; public Item(String caption) this.caption=caption; public abstract String makeHTML();抽象零件:Link 类 Link 类是以抽象方式表示 HTML超链接的类。url 字段用来存储超链网站的URL。该抽象类实现Item 抽象类。代码 :/* * 以抽象方式 表示HTML超链接的类 * author Administrator * */public abstract class Link extends Item protected String url; public Link(String caption,String url) super(caption); / TODO Auto-generated constructor stub this.url=url; 抽象零件:Tray类Tray 类是表示 收集一个以上的Link 或Tray 类。Link 和Tray 则利用add 方法把它们 找出来。add 方法对于“LINK”和“Tray” 这部分的表现方式则是将Link 和 Tray 的父类Item 设为参数。Tray 类继承 了Item 类的抽象方法makeHTML,但并未实现。所以Tray 类也是抽象类。代码 :/* * 表示收集一个以上的Link 或Tray的类 * author Administrator * */public abstract class Tray extends Item protected Vector tray=new Vector(); public Tray(String caption) super(caption); / TODO Auto-generated constructor stub public void add(Item item) tray.add(item); 抽象产品:Page 类Page 类则是以抽象的方式表现整个HTML网页的类。如果说LINK和TRAY是抽象零件,那么Page 类就可以说是抽象的“产品”(负责最终输出HTML)。Title字段是网页的标题,author 是网页的作者。最后以OutPut 输出数据。代码 :/* * 以抽象的方式表现整个HTML网页的类 * * author Administrator * */public abstract class Page protected String title; protected String author; protected Vector content=new Vector(); public Page(String title, String author) this.title = title; this.author = author; public void add(Item item) content.add(item); public String outPut() StringBuffer sb=new StringBuffer(); sb.append(title+.htmln); sb.append(makeHtml(); return sb.toString(); public abstract String makeHtml();抽象产品参与 者规定由抽象工厂参与者所产生的抽象零件和产品的接口(API)。扮演这个参与者的是LINK类、Tray 类和Page 类。抽象工厂:Factory 类 该类包含一个getFactory 方法,利用参数Class得到一个类的对象实例。在抽象工厂制作零件或产品时,会用到createLink、createTray、createPage这几个方法。这些方法都是抽象方法,实际上的具体零件和产品制作过程则交给Factory 的子类来处理,方法是由这里来规定。代码 :/* * 抽象工厂,在抽象工厂通过各个零件制作成产品 * * author Administrator * */public abstract class Factory public static Factory getFactory(Class cls) Factory factory = null; try factory = (Factory) cls.newInstance(); catch (InstantiationException e) / TODO Auto-generated catch block e.printStackTrace(); catch (IllegalAccessException e) / TODO Auto-generated catch block e.printStackTrace(); return factory; public abstract Link createLink(String caption, String url); public abstract Tray createTray(String caption); public abstract Page createPage(String title, String author);抽象工厂参与者则规定用来产生抽象产品参与者的对象实例的接口 (API),扮演这个角色的是Factory 类。具体工厂:ListFactory 类该类实现Factory 类的抽象方法createLink 、createTray、createPage。这里的实现工具调用 new 函数把ListLink 、ListTray 、ListPage 创建出来(可以利用之前写过的Prototype 进行clone) 。代码:/* * 具体工厂 * * author Administrator * */public class ListFactory extends Factory Overridepublic Link createLink(String caption, String url) / TODO Auto-generated method stub return new ListLink(caption, url); Override public Page createPage(String title, String author) / TODO Auto-generated method stub return new ListPage(title, author); Override public Tray createTray(String caption) / TODO Auto-generated method stub return new ListTray(caption); 具体零件:ListLink 类该类为Link 的子类,负责实现Link 的makeHTML抽象方法。代码:public class ListLink extends Link public ListLink(String caption, String url) super(caption, url); / TODO Auto-generated constructor stub Override public String makeHTML() / TODO Auto-generated method stub return + caption + n; 具体零件:ListTray类该类为Tray 的子类,同上文一样负责实现抽象类Tray 的makeHtml方法。代码:public class ListTray extends Tray public ListTray(String caption) super(caption); / TODO Auto-generated constructor stub Override public String makeHTML() / TODO Auto-generated method stub StringBuffer sb = new StringBuffer(); sb.append(n); sb.append(caption + n); sb.append(n); Iterator it = tray.iterator(); while (it.hasNext() Item item=(Item)it.next(); sb.append(item.makeHTML(); /调用 ListLink实现完成后的makeHtml sb.append(n); sb.append(n); return sb.toString(); 抽象零件:ListPage类 原理与上文相似。代码:public class ListPage extends Page public ListPage(String title, String author) super(title, author); / TODO Auto-generated constructor stub Override public String makeHtml() / TODO Auto-generated method stub StringBuffer sb = new StringBuffer(); sb.append( + title + n); sb.append(n); sb.append( + title + n); sb.append(n); Iterator it=content.iterator(); while(it.hasNext() Item item=(Item)it.next(); sb.append(item.makeHTML(); /调用 ListTray 实现完成 后的makeHTML sb.append(n); sb.append(+author+); sb.append(n); return sb.toString(); 具体产品参与者是实现抽象产品参与者的界面(API)。扮演这个角色分别为:ListLink 类、ListTray 类、ListPage类。利用工厂把零件组合成产品:AbstractFactoryPatternActivity 类该类是界面UI展示入口,负责将抽象工厂的抽象零件和具体产品组装打包,通过传入创建的具体工厂,组装具体产品。利用outPut 输出。代码:public class AbstractFactoryPatternActivity extends Activity /* Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); (Button) findViewById(R.id.Button01) .setOnClickListener(new OnClickListener() Override public void onClick(View v) / TODO Auto-generated method stub Factory factory = Factory.getFactory(ListFactory.class); Link cnblogs = factory.createLink(, /terryblog); Link cto = factory.createLink(51CTO, /); Link csdn = factory.createLink(, /terryyhl); Tray cnblogsTray = factory.createTray(); cnblogsTray.add(cnblogs); Tray ctoTray = factory.createTray(); ctoTray.add(cto); Tray csdnTray = factor

温馨提示

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

评论

0/150

提交评论