android 类抽象方法,Android Ap 开发 设计模式第八篇:抽象工厂模式

Abstract Factory Pattern

模式解读

abstract 是“抽象”,factory 是“工厂”,所以合起来abstract factory 就是“抽象工厂”的意思。Abstract Factory Pattern 中的抽象工厂则是把各种抽象零件合成抽象产品。换句话说,处理的重点是在接口(api)而不是零件的具体实现。只利用接口(API)就能把零件组合成产品。

模板方法模式和生成模式的情形 是在子类进行具体的实现,而抽象工厂模式也同样是由子类来处理具体 的实现。在子类就会出现具体工厂利用具体零件组合而成的具体产品。

程序示例

本篇涉及的类较多,较之单例模式而言理解真来比较难。一步步来吧。

本例将使用抽象工厂,制作输出一个HTML语言显示在Android 的文本上。由于涉及类比较多,先上UML图,再一一解释:

abstractfactoryUML.png

抽象零件:Item 类

caption字段 是此项目的“标题”。

makeHtml 方法是抽象方法,须等待子类进行实现。一旦调用 此方法时,其返回值即为HTML字符串(子类要有这样的执行功能)。代码:

publicabstractclassItem {protectedString caption;publicItem(String caption){this.caption=caption;

}publicabstractString makeHTML();

}

抽象零件:Link 类

Link 类是以抽象方式表示 HTML超链接的类。

url 字段用来存储超链网站的URL。该抽象类实现Item 抽象类。代码 :

/*** 以抽象方式 表示HTML超链接的类

*@authorAdministrator

**/publicabstractclassLinkextendsItem{protectedString url;publicLink(String caption,String url) {super(caption);//TODO Auto-generated constructor stubthis.url=url;

}

}

抽象零件:Tray类

Tray 类是表示 收集一个以上的Link 或Tray 类。

Link 和Tray 则利用add 方法把它们 找出来。add 方法对于“LINK”和“Tray” 这部分的表现方式则是将Link 和 Tray 的父类Item 设为参数。

Tray 类继承 了Item 类的抽象方法makeHTML,但并未实现。所以Tray 类也是抽象类。代码 :

/*** 表示收集一个以上的Link 或Tray的类

*@authorAdministrator

**/publicabstractclassTrayextendsItem{protectedVectortray=newVector();publicTray(String caption) {super(caption);//TODO Auto-generated constructor stub}publicvoidadd(Item item){

tray.add(item);

}

}

抽象产品:Page 类

Page 类则是以抽象的方式表现整个HTML网页的类。如果说LINK和TRAY是抽象零件,那么Page 类就可以说是抽象的“产品”(负责最终输出HTML)。Title字段是网页的标题,author 是网页的作者。最后以OutPut 输出数据,代码 :

/*** 以抽象的方式表现整个HTML网页的类

*

*@authorAdministrator

**/publicabstractclassPage {protectedString title;protectedString author;protectedVectorcontent=newVector();publicPage(String title, String author) {this.title=title;this.author=author;

}publicvoidadd(Item item){

content.add(item);

}publicString outPut(){

StringBuffer sb=newStringBuffer();

sb.append(title+".html\n");

sb.append(makeHtml());returnsb.toString();

}publicabstractString makeHtml();

}

抽象产品参与 者规定由抽象工厂参与者所产生的抽象零件和产品的接口(API)。扮演这个参与者的是LINK类、Tray 类和Page 类。

抽象工厂:Factory 类

该类包含一个getFactory 方法,利用参数Class>得到一个类的对象实例。

在抽象工厂制作零件或产品时,会用到createLink、createTray、createPage这几个方法。这些方法都是抽象方法,实际上的具体零件和产品制作过程则交给Factory 的子类来处理,方法是由这里来规定。代码 :

/*** 抽象工厂,在抽象工厂通过各个零件制作成产品

*

*@authorAdministrator

**/publicabstractclassFactory {publicstaticFactory getFactory(Class>cls) {

Factory factory=null;try{

factory=(Factory) cls.newInstance();

}catch(InstantiationException e) {//TODO Auto-generated catch blocke.printStackTrace();

}catch(IllegalAccessException e) {//TODO Auto-generated catch blocke.printStackTrace();

}returnfactory;

}publicabstractLink createLink(String caption, String url);publicabstractTray createTray(String caption);publicabstractPage createPage(String title, String author);

}

抽象工厂参与者则规定用来产生抽象产品参与者的对象实例的接口 (API),扮演这个角色的是Factory 类。

具体工厂:ListFactory 类

该类实现Factory 类的抽象方法createLink 、createTray、createPage。这里的实现工具调用 new 函数把ListLink 、ListTray 、ListPage 创建出来(可以利用之前写过的Prototype 进行clone) 。代码:

/*** 具体工厂

*

*@authorAdministrator

**/publicclassListFactoryextendsFactory {

@OverridepublicLink createLink(String caption, String url) {//TODO Auto-generated method stubreturnnewListLink(caption, url);

}

@OverridepublicPage createPage(String title, String author) {//TODO Auto-generated method stubreturnnewListPage(title, author);

}

@OverridepublicTray createTray(String caption) {//TODO Auto-generated method stubreturnnewListTray(caption);

}

}

具体零件:ListLink 类

该类为Link 的子类,负责实现Link 的makeHTML抽象方法。代码:

publicclassListLinkextendsLink {publicListLink(String caption, String url) {super(caption, url);//TODO Auto-generated constructor stub}

@OverridepublicString makeHTML() {//TODO Auto-generated method stubreturn"

"+caption+"\n";

}

}

具体零件:ListTray类

该类为Tray 的子类,同上文一样负责实现抽象类Tray 的makeHtml方法。代码:

publicclassListTrayextendsTray {publicListTray(String caption) {super(caption);//TODO Auto-generated constructor stub}

@OverridepublicString makeHTML() {//TODO Auto-generated method stubStringBuffer sb=newStringBuffer();

sb.append("

\n");

sb.append(caption+"\n");

sb.append("

  • \n");

Iteratorit=tray.iterator();while(it.hasNext()) {

Item item=(Item)it.next();

sb.append(item.makeHTML());//调用 ListLink实现完成后的makeHtml}

sb.append("

\n");

sb.append("

\n");returnsb.toString();

}

}

抽象零件:ListPage类

原理与上文相似,代码:

publicclassListPageextendsPage {publicListPage(String title, String author) {super(title, author);//TODO Auto-generated constructor stub}

@OverridepublicString makeHtml() {//TODO Auto-generated method stubStringBuffer sb=newStringBuffer();

sb.append("

"+title+"\n");

sb.append("

\n");

sb.append("

"+title+"

\n");

sb.append("

  • \n");

Iteratorit=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");returnsb.toString();

}

}

具体产品参与者是实现抽象产品参与者的界面(API)。扮演这个角色分别为:ListLink 类、ListTray 类、ListPage类。

利用工厂把零件组合成产品:AbstractFactoryPatternActivity 类

该类是界面UI展示入口,负责将抽象工厂的抽象零件和具体产品组装打包,通过传入创建的具体工厂,组装具体产品。利用outPut 输出。代码:

publicclassAbstractFactoryPatternActivityextendsActivity {/**Called when the activity is first created.*/@OverridepublicvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.main);

((Button) findViewById(R.id.Button01))

.setOnClickListener(newOnClickListener() {

@OverridepublicvoidonClick(View v) {//TODO Auto-generated method stubFactory factory=Factory.getFactory(ListFactory.class);

Link cnblogs=factory.createLink("博客园","http://www.cnblogs.com/terryblog");

Link cto=factory.createLink("51CTO","http://terryblog.blog.51cto.com/");

Link csdn=factory.createLink("博客园","http://blog.csdn.net/terryyhl");

Tray cnblogsTray=factory.createTray("第一博客");

cnblogsTray.add(cnblogs);

Tray ctoTray=factory.createTray("第二博客");

ctoTray.add(cto);

Tray csdnTray=factory.createTray("第三博客");

csdnTray.add(csdn);

Page page=factory.createPage("my Blogs","terry_龙");

page.add(cnblogsTray);

page.add(ctoTray);

page.add(csdnTray);

((EditText) findViewById(R.id.EditText01)).setText(page

.outPut());

}

});

}

}

客户参与者是一个只使用抽象工厂参与者和抽象产品参与者的接口 (API)来完成 工作 的参与者。客户参与者并不知道具体零件、产品或工厂。而上面的代码就是负责做这件事。

运行结果:

abstractfactoryResult.png

×××:

再发个求职信息:

求职android(可胜任Framework及 以上工作。一年半经验) 、Windows Phone 7(软件、XNA) 开发工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值