Android Ap 开发 设计模式第六篇:原型模式
Prototype Pattern
名稱由來(lái)
不是利用類來(lái)產(chǎn)生實(shí)例對(duì)象,而是從一個(gè)對(duì)象實(shí)例產(chǎn)生出另一個(gè)新的對(duì)象實(shí)例 ,根據(jù)被視為原型的對(duì)象實(shí)例 ,建立起的另一個(gè)新的對(duì)象實(shí)例就稱為原型模式(Ptototype Pattern)。
?
需求場(chǎng)景
?
- 種類過(guò)多無(wú)法整合成類時(shí)
第一種情形:若須處理的對(duì)象種類太多,如果要一個(gè)個(gè)設(shè)成不同的類,須產(chǎn)生大量的源程序文件 - 不容易利用類產(chǎn)生對(duì)象實(shí)例時(shí)
第二種情形:該對(duì)象的實(shí)例產(chǎn)生過(guò)程太復(fù)雜,很難利用類來(lái)建立。 - 希望把框架和所產(chǎn)生的對(duì)象實(shí)例分開時(shí)
第三種情形:希望讓產(chǎn)生對(duì)象實(shí)例時(shí)的框架不會(huì)只存在于某些特殊類時(shí)。
功能演示
?
測(cè)試程序類結(jié)構(gòu)圖如下:
模式UML圖中,共有三個(gè)類:
- 接口,Product 己聲明抽象方法use 和 createClone的接口
- 管理類,Manager 利用createClone 復(fù)制對(duì)象實(shí)例的類
- 普通類,MessageBox 把字符串框起來(lái)use 的類,實(shí)現(xiàn)Product的createClone 和use 方法。
Product 接口
?
public?interface?Product?extends?Cloneable{????public?abstract?String?use(String?s);
????
????public?abstract?Product?createClone();
}
有了Product 接口 ,才可能進(jìn)行復(fù)制。這個(gè)接口繼承java.lang.Cloneable 接口 ,利用clone 方法可自動(dòng)對(duì)實(shí)現(xiàn)此接口 的類進(jìn)行復(fù)制。
use 方法是“使用”的部分,“使用”代表何種意義則需看子類的實(shí)現(xiàn)。
createClone方法負(fù)責(zé)復(fù)制對(duì)象實(shí)例的部分。
Manager類
?
public?class?Manager?{????private?Hashtable<String,?Product>?showCase?=?new?Hashtable<String,?Product>();
????public?void?register(String?name,?Product?proto)?{
????????showCase.put(name,?proto);
????}
????public?Product?create(String?protoName)?{
????????Product?p?=?showCase.get(protoName);
????????return?p.createClone();
????}
}
唯一跟其他類溝通的橋梁,負(fù)責(zé)添加和負(fù)責(zé)對(duì)象的實(shí)例。
?
MessageBox類
?
public?class?MessageBox?implements?Product?{????private?char?decochar;
????public?MessageBox(char?dechar)?{
????????this.decochar?=?dechar;
????}
????@Override
????public?Product?createClone()?{
????????//?TODO?Auto-generated?method?stub
????????Product?p?=?null;
????????try?{
????????????p?=?(Product)?clone();
????????}?catch?(CloneNotSupportedException?e)?{
????????????//?TODO:?handle?exception
????????????e.printStackTrace();
????????}
????????return?p;
????}
????@Override
????public?String?use(String?s)?{
????????//?TODO?Auto-generated?method?stub
????????int?length?=?s.getBytes().length;
????????StringBuffer?sb?=?new?StringBuffer();
????????for?(int?i?=?0;?i?<?length?+?4;?i++)?{
????????????sb.append(decochar);
????????}
?
????????sb.append(decochar?+?"\n\""?+?s?+?"\"\n"?+?decochar);
????????for?(int?i?=?0;?i?<?length?+?4;?i++)?{
????????????sb.append(decochar);
????????}
????????sb.append("");
????????return?sb.toString();
????}
}
?
createClone 方法是復(fù)制本身的方法,這里所調(diào)用的clone 方法規(guī)定在java 語(yǔ)言規(guī)格內(nèi),它會(huì)產(chǎn)生另一個(gè)分身(本身的復(fù)制品)。在產(chǎn)生復(fù)制品時(shí),若該字段包含對(duì)象實(shí)例,則其值也會(huì)跟著復(fù)制到新的對(duì)象實(shí)例。能利用clone 方法進(jìn)行復(fù)制的只限于實(shí)現(xiàn)java.lang.Cloneable 接口 的類。如無(wú)實(shí)現(xiàn)則會(huì)報(bào)異常。但MessageBox 本身實(shí)現(xiàn)了Product ,而Product 是己經(jīng)繼承了Cloneable接口。
Java 語(yǔ)言的clone 方法只能從本身的類(含子類)調(diào)用,所以如果是其他類的要求而進(jìn)行復(fù)制時(shí),則須另以其他方法(如createClone)把clone 抓起來(lái)。
?
android 界面入口測(cè)試該原型 Prototype 的PrototypeActivity
?
public?class?PrototypeActivity?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
????????????????????????Manager?manager?=?new?Manager();
????????????????????????MessageBox?messageBox?=?new?MessageBox('*');
????????????????????????manager.register("prototype",?messageBox);
????????????????????????Product?product?=?manager.create("prototype");
????????????????????????((EditText)?findViewById(R.id.EditText01))
????????????????????????????????.setText(product.use("android?ap?Pattern"));
????????????????????}
????????????????});
????}
}
?
運(yùn)行效果如下:
?
源碼下載:
原型模式
?
再發(fā)個(gè)求職信息:
求職android(可勝任Framework及 以上工作。一年半經(jīng)驗(yàn)) 、Windows Phone 7(軟件、XNA) 開發(fā)工作。
?
?本文轉(zhuǎn)自 terry_龍 51CTO博客,原文鏈接:http://blog.51cto.com/terryblog/612359,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的Android Ap 开发 设计模式第六篇:原型模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PMP备考资料和备考经验分享(基于PMP
- 下一篇: Android开发如何使用JNA