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

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

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

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

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
国产精品久久在线观看| 一区二区三区四区视频| 久久激情视频免费观看| 久久久久国色av免费观看性色| 不卡av在线网站| 亚洲精品黄网在线观看| 国产一区视频在线| 日韩成人久久久| 亚洲欧洲第一视频| 97欧美精品一区二区三区| 中文字幕一区二区精品| 国产精品第3页| 亚洲成年人影院在线| 伊人久久免费视频| 成人伊人精品色xxxx视频| 欧美大片欧美激情性色a∨久久| 欧美日韩国产一区二区三区| 久久久极品av| 久久精品在线视频| 久久精品视频播放| 国精产品一区一区三区有限在线| 久久福利视频网| 国产精品综合网站| 亚洲xxxx做受欧美| 久久久久www| 欧美日韩精品中文字幕| 国产成人精品久久二区二区| 国模私拍视频一区| 欧美激情高清视频| 亚洲电影中文字幕| 色综合91久久精品中文字幕| 98精品国产自产在线观看| 久久国产精品视频| 日韩精品有码在线观看| 久久6免费高清热精品| 一本色道久久88精品综合| 亚洲成人网在线| 久久久久久一区二区三区| 亚洲97在线观看| 国产精品久久久久久av| 欧美人与性动交a欧美精品| 久久精品国产精品亚洲| 国产精品第一页在线| 欧美成人亚洲成人日韩成人| 亚洲直播在线一区| 66m—66摸成人免费视频| 国产一区二区三区精品久久久| 国产深夜精品福利| 国产一区二区美女视频| 九九热在线精品视频| 国产精品海角社区在线观看| 色久欧美在线视频观看| 日韩不卡中文字幕| 欧美激情国产高清| 日韩av免费在线| 日韩精品久久久久| 4388成人网| 国产精品女视频| 亚洲男人的天堂在线播放| 亚洲国产精品久久久久秋霞不卡| 亚洲第一页在线| 亚洲天堂av高清| 欧美日韩免费在线观看| 欧美大成色www永久网站婷| 亚洲男人的天堂网站| 亚洲欧洲视频在线| 亚洲成人精品在线| 久久精品国产69国产精品亚洲| 97人人爽人人喊人人模波多| 欧美大人香蕉在线| 亚洲精品一区二区久| 亚洲午夜未满十八勿入免费观看全集| 久久久久久国产| 亚洲成色777777在线观看影院| 国产成人免费av电影| 亚洲第一av网站| 成人免费淫片aa视频免费| 国内精品久久久久影院 日本资源| 国产日韩视频在线观看| 国产精品 欧美在线| 中文国产成人精品| 欧美极品少妇xxxxⅹ裸体艺术| 色噜噜狠狠色综合网图区| 欧美另类暴力丝袜| 国产精品第2页| 久久久久久国产三级电影| 日韩最新av在线| 日韩欧美极品在线观看| 日韩风俗一区 二区| 成人激情在线观看| 国产成人免费av| 成人a级免费视频| 国产成人精品久久二区二区| 欧美一区二区三区艳史| 黄色成人在线免费| 亚洲一区二区中文字幕| 国产精品高清在线| 欧美黄色片免费观看| 国产主播喷水一区二区| 日韩欧美国产免费播放| 亚洲免费视频网站| 日本精品性网站在线观看| 91精品视频播放| 国产精品亚洲美女av网站| 国产精品久久久久久久久久久久| 不卡av在线播放| 日韩欧美主播在线| 精品偷拍各种wc美女嘘嘘| 成人h视频在线| 久久久在线视频| 欧美电影免费观看电视剧大全| 欧美大奶子在线| www.国产精品一二区| 国产精品精品久久久久久| 久久精品欧美视频| 国产精品国产福利国产秒拍| 亚洲精品999| 精品国产乱码久久久久久婷婷| 欧美激情视频网站| 国产成人免费av| 国产精品视频大全| 精品日本高清在线播放| 日韩av在线最新| 日韩免费av一区二区| 日韩av理论片| 久久99精品久久久久久琪琪| 国产日韩精品视频| 狠狠躁夜夜躁人人爽天天天天97| 欧美韩日一区二区| 国产精品一区二区电影| 色综合色综合网色综合| 亚洲欧美中文字幕| 国产精品老牛影院在线观看| 欧美最顶级丰满的aⅴ艳星| 日韩一区二区欧美| 亚洲欧美精品在线| 亚洲欧美国内爽妇网| 精品无人区乱码1区2区3区在线| 亚洲国产精品久久久久久| 久久91亚洲人成电影网站| 国产精品久久电影观看| 911国产网站尤物在线观看| 久久国产精品久久久久久| 91久久精品国产91久久性色| 久久久亚洲福利精品午夜| 欧美国产日韩在线| 欧美在线精品免播放器视频| 91精品国产乱码久久久久久蜜臀| 91九色视频导航| 555www成人网| 日韩亚洲精品视频| 欧美日韩精品中文字幕| 亚洲女人被黑人巨大进入al| 久久艳片www.17c.com| 久久久免费观看| 亚洲色图在线观看| 精品高清美女精品国产区| 成人av在线亚洲| 国产欧美日韩丝袜精品一区| 91天堂在线观看| 91精品国产成人www| 午夜精品一区二区三区在线视频| 欧美激情免费视频| 亚洲综合第一页|