国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java設(shè)計(jì)模式概述之創(chuàng)建型模式

2019-11-14 11:56:31
字體:
供稿:網(wǎng)友

java一共有23種設(shè)計(jì)模式,23種設(shè)計(jì)模式大致分為三大類:創(chuàng)建模式、結(jié)構(gòu)化模式、行為模式。

Tip:由于23三種設(shè)計(jì)模式的篇幅較長(zhǎng),先來介紹我們比較熟悉的建造者模式。

一、單例模式(Singleton)


單例模式中的單例是指唯一的實(shí)例對(duì)象。Java API中的Calendar類就利用了單例模式。相信大家應(yīng)該對(duì)這條語句不陌生:Calendar.getInstance()。這條語句創(chuàng)建了一個(gè)單例。再如在某些應(yīng)用場(chǎng)景下,需要重復(fù)獲取同一個(gè)實(shí)例對(duì)象,不斷new對(duì)象勢(shì)必會(huì)造成Java堆中的內(nèi)存浪費(fèi),因此,我們可以把該對(duì)象單例化,達(dá)到重復(fù)利用統(tǒng)一資源的目的。

單例模式代碼:

/** * @author Hanlin Wang */public class SingletonMode { public static void main(String[] args) { Singleton instance = Singleton.getInstance(); Singleton instance2 = Singleton.getInstance(); System.out.PRintln(instance==instance2); }}//懶漢式class Singleton{ //定義一個(gè)Singleton類型的變量。private防止外部訪問;static能夠以靜態(tài)方式獲取;null實(shí)現(xiàn)延遲加載。 private static Singleton instance = null; //私有化構(gòu)造方法,防止外部創(chuàng)建該對(duì)象。 private Singleton(){} //synchronized方法:使單例對(duì)象創(chuàng)建時(shí),線程安全。 private static synchronized void syncInit(){ if (null == instance) { instance = new Singleton(); } } //公共的、靜態(tài)的方法,獲取唯一的實(shí)例。 public static Singleton getInstance(){ if (null == instance) { syncInit(); } return instance; }}

單例模式通過類創(chuàng)建唯一的實(shí)例對(duì)象。形如:Singleton.getInstance()。而我們經(jīng)常通過Object obj = new Object();創(chuàng)建實(shí)例對(duì)象,一定要區(qū)分清楚:類創(chuàng)建實(shí)例對(duì)象是把new對(duì)象語句插入到該類的一個(gè)靜態(tài)方法中,從而可以以類名.方法名調(diào)用創(chuàng)建實(shí)例對(duì)象的方法。由于要通過類創(chuàng)建單例,必須把創(chuàng)建對(duì)象的方法加上static修飾符。要能訪問該方法,所以方法還要加上public修飾符。又由于靜態(tài)方法只能作用于靜態(tài)變量,所以單例對(duì)象的引用變量instance必須用static修飾,這樣instance靜態(tài)變量就被存入了方法區(qū)(詳見JVM虛擬機(jī)內(nèi)存劃分概述)。防止外部直接訪問instance靜態(tài)變量,加上private修飾符。

還有大片細(xì)節(jié)需要大家去細(xì)心琢磨,代碼已上注釋。

二、工廠模式(Factory)


工廠模式分為三大類:普通工廠模式、工廠方法模式、靜態(tài)工廠方法模式。

1、普通工廠模式

普通工廠模式內(nèi)部定義一個(gè)生產(chǎn)方法,方法中接受一個(gè)參數(shù),根據(jù)參數(shù)值的不同來創(chuàng)建相應(yīng)的對(duì)象。

代碼:

//普通工廠模式class Factory{ public C produce(String type){ if ("A".equals(type)) { return new A(); } else if ("B".equals(type)) { return new B(); } else { return null; } }}//定義一個(gè)接口類Cinterface C{ void run();}//定義兩個(gè)實(shí)現(xiàn)類A、Bclass A implements C{ public void run(){ System.out.println("A's running"); }}class B implements C{ public void run(){ System.out.println("B's running"); }}public class FactoryMode { public static void main(String[] args) { /*普通工廠模式 Factory factory = new Factory(); C a = factory.produce("A"); C b = factory.produce("B"); a.run(); b.run();*/ }}

可見,根據(jù)傳入?yún)?shù)名的不同來決定生產(chǎn)何類對(duì)象。

2、工廠方法模式

普通工廠模式通過傳入的參數(shù)來判斷創(chuàng)建何種對(duì)象,這樣存在一個(gè)問題,如下: public C produce(String type) 返回的是C類型,雖然這樣很好的利用了多態(tài)的特性,但我們無法得知返回的對(duì)象是C接口的哪一個(gè)實(shí)現(xiàn)類,A?還是B?。

因此,工廠方法模式通過在工廠類中定義一系列方法來實(shí)現(xiàn)精準(zhǔn)創(chuàng)建具體類型的實(shí)力對(duì)象。

代碼:

//工廠方法模式class MethodFactory{ public A produceA(){ return new A(); } public B produceB(){ return new B(); }}//定義一個(gè)接口類Cinterface C{ void run();}//定義兩個(gè)實(shí)現(xiàn)類A、Bclass A implements C{ public void run(){ System.out.println("A's running"); }}class B implements C{ public void run(){ System.out.println("B's running"); }}public class FactoryMode { public static void main(String[] args) { MethodFactory factory = new MethodFactory(); A a = factory.produceA(); B b = factory.produceB(); a.run(); b.run(); }}

3、靜態(tài)工廠方法模式

靜態(tài)工廠方法模式與工廠方法模式類似,以靜態(tài)的方式調(diào)用工廠類的方法。我們只需在工廠方法模式的基礎(chǔ)上給工廠類中的方法加上static修飾符。

代碼:

//靜態(tài)工廠方法模式class StaticFactory{ public static A produceA(){ return new A(); } public static B produceB(){ return new B(); }}

三、抽象工廠模式(Abstract Factory)


普通(class)工廠模式 VS 抽象(interface、abstract class)工廠模式。這么一形(dou)象(bi)的比較,相信大家肯定猜到區(qū)別了。抽象工廠模式把工廠類中的方法抽取出來放在了一個(gè)interface中,工廠類實(shí)現(xiàn)interface中的方法就是抽象工廠模式。由于是工廠類繼承工廠類接口,因此不能使用static關(guān)鍵字來修飾工廠類的方法。

代碼:

class Factory{ public C produce(String type){ if ("A".equals(type)) { return new A(); } else if ("B".equals(type)) { return new B(); } else { return null; } }}//定義一個(gè)接口類Cinterface C{ void run();}//定義兩個(gè)實(shí)現(xiàn)類A、Bclass A implements C{ public void run(){ System.out.println("A's running"); }}class B implements C{ public void run(){ System.out.println("B's running"); }}//抽象工廠模式。創(chuàng)建一個(gè)Provider,被各種工廠類實(shí)現(xiàn)。interface Provider{ C produce();}class FactoryA implements Provider{ public C produce(){ return new A(); }}class FactoryB implements Provider{ public C produce(){ return new B(); }}public class FactoryMode { public static void main(String[] args) { FactoryA factoryA = new FactoryA(); FactoryB factoryB = new FactoryB(); C a = factoryA.produce(); C b = factoryB.produce(); a.run(); b.run(); }}

四、建造者模式(Builder)


工廠模式專注于創(chuàng)建單一對(duì)象,建造者模式在工廠模式的基礎(chǔ)上側(cè)重對(duì)象的批量創(chuàng)建。

代碼:

/** * @author Hanlin Wang *///工廠模式關(guān)注的是創(chuàng)建單個(gè)產(chǎn)品,而建造者模式則關(guān)注創(chuàng)建符合對(duì)象,多個(gè)部分。因此,是選擇工廠模式還是建造者模式,依實(shí)際情況而定。public class BuilderMode { public static void main(String[] args) { Builder builder = new Builder(); builder.batchProduceA(10); builder.batchProduceB(15); }}class Builder{ private ArrayList<C> list = new ArrayList<C>(); public void batchProduceA(int count){ for (int i = 0; i < count; i++) { list.add(new A()); } } public void batchProduceB(int count){ for (int i = 0; i < count; i++) { list.add(new B()); } }}

建造者模式通過for循環(huán)批量創(chuàng)建了A、B對(duì)象,并將A、B對(duì)象存儲(chǔ)到List集合對(duì)象中。

五、原型模式(Prototype)


原型模式用于克隆對(duì)象。原型模式克隆分淺克隆和深克隆。利用原型模式克隆,可以適當(dāng)代替new對(duì)象這一操作,擁有new對(duì)象所不具備的,賦值屬性,對(duì)象狀態(tài)等等。

淺克隆只克隆對(duì)象本身,不克隆對(duì)象屬性,而克隆對(duì)象屬性的引用。

深克隆不但克隆對(duì)象本身,還克隆了對(duì)象的屬性,是完全唯一的。若實(shí)現(xiàn)序列化接口,還可進(jìn)行序列化和反序列化操作。

代碼:

import java.io.IOException;import java.util.ArrayList;/** * @author Hanlin Wang */public class PrototypeMode { public static void main(String[] args) throws CloneNotSupportedException, ClassNotFoundException, IOException { Prototype proto = new Prototype(); Prototype clone1 = (Prototype) proto.clone(); Prototype clone2 = (Prototype) proto.clone(); System.out.println(clone1 == clone2); System.out.println(clone1.getInfo() == clone2.getInfo()); Prototype deepClone1 = (Prototype) proto.deepClone(); Prototype deepClone2 = (Prototype) proto.deepClone(); System.out.println(deepClone1 == deepClone2); System.out.println(deepClone1.getInfo() == deepClone2.getInfo()); /*false true false false*/ }}class Prototype implements Cloneable{ private ArrayList<String> info = new ArrayList<String>(); public ArrayList<String> getInfo() { return info; } public void setInfo(ArrayList<String> info) { this.info = info; } //淺克隆 public Object clone() throws CloneNotSupportedException{ Prototype proto = (Prototype) super.clone(); return proto; } //深克隆 public Object deepClone() throws CloneNotSupportedException{ Prototype proto = (Prototype) super.clone(); proto.info = (ArrayList<String>) info.clone(); return proto; }}

以上就是Java設(shè)計(jì)模式中創(chuàng)建型模式的概述,相信大家應(yīng)該有所收獲。

讀者朋友也可以給我留言,我會(huì)認(rèn)真回復(fù),什么類型的意見建議都可以,歡迎討論。

隨后我會(huì)推出后續(xù)的有關(guān)設(shè)計(jì)模式的博文,我們不見不散~


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 鄱阳县| 蒙山县| 德安县| 昭苏县| 高淳县| 视频| 丹阳市| 萝北县| 呈贡县| 渝北区| 林甸县| 澳门| 玉环县| 葫芦岛市| 远安县| 弥渡县| 聂拉木县| 轮台县| 龙陵县| 津市市| 新建县| 吉林省| 商河县| 开鲁县| 仪陇县| 郧西县| 女性| 和龙市| 建始县| 尼勒克县| 渭南市| 辉南县| 乡宁县| 双牌县| 浦县| 黄浦区| 高清| 阿拉善右旗| 梅州市| 阿荣旗| 上高县|