亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java設計模式概述之創建型模式

2019-11-14 13:06:20
字體:
來源:轉載
供稿:網友

java一共有23種設計模式,23種設計模式大致分為三大類:創建模式、結構化模式、行為模式。

Tip:由于23三種設計模式的篇幅較長,先來介紹我們比較熟悉的建造者模式。

一、單例模式(Singleton)


單例模式中的單例是指唯一的實例對象。Java API中的Calendar類就利用了單例模式。相信大家應該對這條語句不陌生:Calendar.getInstance()。這條語句創建了一個單例。再如在某些應用場景下,需要重復獲取同一個實例對象,不斷new對象勢必會造成Java堆中的內存浪費,因此,我們可以把該對象單例化,達到重復利用統一資源的目的。

單例模式代碼:

/** * @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{ //定義一個Singleton類型的變量。private防止外部訪問;static能夠以靜態方式獲?。籲ull實現延遲加載。 private static Singleton instance = null; //私有化構造方法,防止外部創建該對象。 private Singleton(){} //synchronized方法:使單例對象創建時,線程安全。 private static synchronized void syncInit(){ if (null == instance) { instance = new Singleton(); } } //公共的、靜態的方法,獲取唯一的實例。 public static Singleton getInstance(){ if (null == instance) { syncInit(); } return instance; }}

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

還有大片細節需要大家去細心琢磨,代碼已上注釋。

二、工廠模式(Factory)


工廠模式分為三大類:普通工廠模式、工廠方法模式、靜態工廠方法模式。

1、普通工廠模式

普通工廠模式內部定義一個生產方法,方法中接受一個參數,根據參數值的不同來創建相應的對象。

代碼:

//普通工廠模式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; } }}//定義一個接口類Cinterface C{ void run();}//定義兩個實現類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();*/ }}

可見,根據傳入參數名的不同來決定生產何類對象。

2、工廠方法模式

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

因此,工廠方法模式通過在工廠類中定義一系列方法來實現精準創建具體類型的實力對象。

代碼:

//工廠方法模式class MethodFactory{ public A produceA(){ return new A(); } public B produceB(){ return new B(); }}//定義一個接口類Cinterface C{ void run();}//定義兩個實現類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、靜態工廠方法模式

靜態工廠方法模式與工廠方法模式類似,以靜態的方式調用工廠類的方法。我們只需在工廠方法模式的基礎上給工廠類中的方法加上static修飾符。

代碼:

//靜態工廠方法模式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)的比較,相信大家肯定猜到區別了。抽象工廠模式把工廠類中的方法抽取出來放在了一個interface中,工廠類實現interface中的方法就是抽象工廠模式。由于是工廠類繼承工廠類接口,因此不能使用static關鍵字來修飾工廠類的方法。

代碼:

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; } }}//定義一個接口類Cinterface C{ void run();}//定義兩個實現類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"); }}//抽象工廠模式。創建一個Provider,被各種工廠類實現。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)


工廠模式專注于創建單一對象,建造者模式在工廠模式的基礎上側重對象的批量創建。

代碼:

/** * @author Hanlin Wang *///工廠模式關注的是創建單個產品,而建造者模式則關注創建符合對象,多個部分。因此,是選擇工廠模式還是建造者模式,依實際情況而定。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循環批量創建了A、B對象,并將A、B對象存儲到List集合對象中。

五、原型模式(Prototype)


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

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

深克隆不但克隆對象本身,還克隆了對象的屬性,是完全唯一的。若實現序列化接口,還可進行序列化和反序列化操作。

代碼:

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設計模式中創建型模式的概述,相信大家應該有所收獲。

讀者朋友也可以給我留言,我會認真回復,什么類型的意見建議都可以,歡迎討論。

隨后我會推出后續的有關設計模式的博文,我們不見不散~


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色伦专区97中文字幕| 国产日韩专区在线| 国产网站欧美日韩免费精品在线观看| 久久人人爽人人爽人人片av高清| 欧美在线视频在线播放完整版免费观看| 亚洲欧洲在线播放| 成人黄色大片在线免费观看| 日本国产精品视频| 自拍偷拍亚洲在线| 欧美国产日产韩国视频| 日韩高清av一区二区三区| 亚洲国产成人在线视频| 国产欧美日韩中文| 国产精品99久久久久久白浆小说| 亚洲高清免费观看高清完整版| 国产精品黄色影片导航在线观看| 亚洲精品www久久久久久广东| 成人黄色网免费| 欧美专区福利在线| 精品美女久久久久久免费| 日韩国产精品亚洲а∨天堂免| 精品福利樱桃av导航| 国产精品免费看久久久香蕉| 国自在线精品视频| 亚洲精品一区二区网址| 永久555www成人免费| 亚洲综合大片69999| 色婷婷av一区二区三区在线观看| 成人欧美一区二区三区黑人| 日韩av日韩在线观看| 欧美成人激情在线| 亚洲欧美第一页| 欧美在线视频一区二区| 国产丝袜一区二区| 大荫蒂欧美视频另类xxxx| 91网站在线看| 97视频在线观看免费高清完整版在线观看| 亚洲欧美激情一区| 亚洲成av人影院在线观看| 亚洲色在线视频| 日本一欧美一欧美一亚洲视频| 久久99久久99精品中文字幕| 69视频在线免费观看| 久久精品国产成人| 俺去亚洲欧洲欧美日韩| 久久久日本电影| 国产成人精品免高潮在线观看| 亚洲国产精品成人精品| 韩日欧美一区二区| 最近2019中文免费高清视频观看www99| 国产日韩欧美日韩大片| 亚洲欧美精品伊人久久| 欧美日韩国产在线| 国产专区欧美专区| 国产日本欧美一区二区三区| 欧美中文字幕在线观看| 国产在线观看精品一区二区三区| 97精品视频在线播放| 91av在线网站| 日韩亚洲成人av在线| 欧美一级电影久久| 亚洲精品久久久久久久久久久久| 国产成人精品电影久久久| 欧美又大又硬又粗bbbbb| 日本精品久久久| 成人深夜直播免费观看| 黑丝美女久久久| 欧美极品欧美精品欧美视频| 亚洲免费视频一区二区| 1769国产精品| 国外成人免费在线播放| 亚洲曰本av电影| 国产精品精品一区二区三区午夜版| 日韩av毛片网| 亚洲国产精品嫩草影院久久| 97在线视频国产| 久久伊人精品天天| 欧美激情在线观看| 久久影院免费观看| 日韩在线中文字| 狠狠躁夜夜躁人人爽天天天天97| 91精品国产91久久| 日韩成人在线视频网站| 不卡中文字幕av| 欧美激情免费视频| 亚洲人成电影在线观看天堂色| 国产精品视频xxxx| 久久久久久久久久国产| 久久av在线看| 中文字幕欧美在线| 久久伊人精品一区二区三区| 日韩免费av一区二区| 久久久久99精品久久久久| 久久91超碰青草是什么| 精品国内亚洲在观看18黄| 国产成人中文字幕| 亚洲欧美一区二区三区久久| 久久精品男人天堂| 在线视频免费一区二区| 中日韩午夜理伦电影免费| 久久夜色精品国产| 亚洲综合小说区| 国语自产精品视频在线看| 国产精品福利在线观看网址| 疯狂做受xxxx高潮欧美日本| 国产欧美日韩视频| 色777狠狠综合秋免鲁丝| 国产精品精品视频| 中文字幕国产精品| 成人写真福利网| 国产美女久久久| 久久天天躁狠狠躁夜夜躁| 亚洲第一综合天堂另类专| 亚洲人成啪啪网站| 欧美日韩黄色大片| 亚洲激情在线观看| 日本不卡高字幕在线2019| 亚洲精品国产免费| 81精品国产乱码久久久久久| 亚洲一区二区久久久| 久久91亚洲人成电影网站| 日本一欧美一欧美一亚洲视频| 26uuu亚洲伊人春色| 国产精品视频26uuu| 国产精品久久久久久久久久| 国产成人精品免费视频| 久久这里有精品视频| 91免费综合在线| 超碰精品一区二区三区乱码| 日韩欧美视频一区二区三区| 久久久精品在线观看| 国产福利精品av综合导导航| 精品自在线视频| 78色国产精品| 黑人巨大精品欧美一区二区三区| 成人美女免费网站视频| 午夜精品久久久久久久白皮肤| 国产精品久久久久久久久免费| 久久精品色欧美aⅴ一区二区| 亚洲黄色av女优在线观看| 米奇精品一区二区三区在线观看| 欧美洲成人男女午夜视频| 在线视频欧美日韩| 亚洲欧美日韩图片| 欧美一区二区三区免费观看| 日韩成人中文字幕| 亚洲午夜精品久久久久久久久久久久| 亚洲美女www午夜| 精品久久久久久久大神国产| 三级精品视频久久久久| 久久久久久久久久婷婷| 国产精品ⅴa在线观看h| 久久久视频免费观看| 最近的2019中文字幕免费一页| 国产精品av免费在线观看| 7777精品视频| 久久99久国产精品黄毛片入口| 午夜精品美女自拍福到在线| 亚洲成人aaa| 国产精品专区第二| 亚洲第一中文字幕| 亚洲最新av在线网站| 国产视频综合在线| 国产91ⅴ在线精品免费观看|