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

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

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

2019-11-14 12:27:21
字體:
來源:轉載
供稿:網友

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能夠以靜態方式獲??;null實現延遲加載。 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
91久久嫩草影院一区二区| 欧美精品性视频| 国产成人97精品免费看片| 日韩电影在线观看中文字幕| 97激碰免费视频| 日韩av一区在线观看| 国产噜噜噜噜噜久久久久久久久| 日韩h在线观看| 91在线观看欧美日韩| 国产精品亚洲视频在线观看| 亚洲一区av在线播放| 日韩欧美在线观看视频| 亚洲欧美第一页| 国产精品久久久久久久app| 亚洲色在线视频| 亚洲欧美国产精品专区久久| 91视频九色网站| 国内精品一区二区三区| 国产精品成人av性教育| 日韩美女视频免费在线观看| 日韩电影在线观看中文字幕| 欧美黄色片免费观看| 国产精品黄色av| 在线播放国产精品| 91亚洲国产成人精品性色| 色婷婷av一区二区三区久久| 久久精品国产综合| 精品国产91久久久| 97超视频免费观看| 日韩在线观看视频免费| 亚洲自拍av在线| 91麻豆国产语对白在线观看| 永久555www成人免费| 国产精品久久久久久久久久99| 综合国产在线视频| 日韩电影中文字幕| 国产成人精品在线播放| 久久青草福利网站| 91精品一区二区| 久久久噜久噜久久综合| 精品免费在线观看| 91国语精品自产拍在线观看性色| 45www国产精品网站| 韩国一区二区电影| 国产日韩欧美中文在线播放| 91tv亚洲精品香蕉国产一区7ujn| 欧美大成色www永久网站婷| 茄子视频成人在线| 在线视频欧美性高潮| 亚洲a在线观看| 成人免费看片视频| 成人精品一区二区三区电影黑人| 欧美视频一二三| 久久精品视频在线| 欧美寡妇偷汉性猛交| 91精品久久久久久久久不口人| 亚洲福利视频专区| 日韩av免费在线观看| 亚洲乱码国产乱码精品精天堂| 亚洲精品免费网站| 一级做a爰片久久毛片美女图片| 97在线观看免费高清| 欧美性在线观看| 亚洲人成网在线播放| 91产国在线观看动作片喷水| 久久精品国产96久久久香蕉| 97成人精品区在线播放| 精品亚洲一区二区三区在线播放| 色噜噜狠狠色综合网图区| 91精品国产91久久久| 欧美日韩一区免费| 91国内在线视频| 91精品视频大全| 中文字幕在线看视频国产欧美在线看完整| 国产精品99久久久久久久久| 久久久亚洲影院你懂的| 国产精品久久久久9999| 亚洲韩国日本中文字幕| 亚洲色图日韩av| 日本精品一区二区三区在线播放视频| 成人精品久久av网站| 日韩精品视频在线| 日韩综合视频在线观看| 国产精品高精视频免费| 亚洲娇小xxxx欧美娇小| 日本欧美一二三区| 国产精品91久久久久久| 国产精品午夜一区二区欲梦| 欧美成人免费网| 亚洲日韩欧美视频一区| 欧洲永久精品大片ww免费漫画| 欧美—级高清免费播放| 91人成网站www| 欧美日韩人人澡狠狠躁视频| 亚洲一级片在线看| 久久久久久国产| 中文字幕欧美视频在线| 久久777国产线看观看精品| 欧美激情在线视频二区| 久久伊人精品一区二区三区| 在线观看欧美日韩国产| 久久精品美女视频网站| 久久精品视频免费播放| 国产免费一区二区三区在线观看| 国产小视频国产精品| 国产成人中文字幕| 午夜美女久久久久爽久久| 伊人久久久久久久久久久| 国产精品丝袜久久久久久高清| 亚洲伦理中文字幕| 日韩av免费看网站| 在线观看国产欧美| 日本久久中文字幕| 亚洲成人激情小说| 国产精品吹潮在线观看| 韩国19禁主播vip福利视频| 国产999视频| 欧美中文字幕在线视频| 超碰精品一区二区三区乱码| 日韩成人av在线播放| 国产成人免费av电影| 2021国产精品视频| 在线观看精品自拍私拍| 亚洲国产一区二区三区在线观看| 亚洲第一福利在线观看| 成人欧美在线视频| 日韩免费在线电影| 亚洲在线观看视频| 国产精品免费观看在线| 国产精品扒开腿爽爽爽视频| 中文字幕日韩专区| 一本色道久久88综合亚洲精品ⅰ| 欧美成人h版在线观看| 欧美成人免费一级人片100| 最近2019中文字幕一页二页| 国产精品久久久久久av福利软件| 久久99精品久久久久久琪琪| 欧美亚洲激情视频| 大伊人狠狠躁夜夜躁av一区| 中文字幕一精品亚洲无线一区| 亚洲91av视频| 亚洲sss综合天堂久久| 国产成人短视频| 精品久久久久久亚洲精品| 一区二区在线视频| 国产午夜精品麻豆| 性欧美激情精品| 国产欧美日韩免费看aⅴ视频| 国产精品久久久| 日韩av免费在线观看| 欧美激情影音先锋| 热久久这里只有| 亚洲精品一区二区三区婷婷月| 国产精品高潮呻吟久久av无限| 国产成人aa精品一区在线播放| 中文字幕日韩高清| 亚洲美女免费精品视频在线观看| 亚洲理论在线a中文字幕| 91人人爽人人爽人人精88v| 久久福利网址导航| 亚洲人免费视频| 国产欧美在线视频| 日韩高清免费观看| 国产精品嫩草影院久久久|