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

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

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

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

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
国产成人综合久久| 国产成人精品久久二区二区| 亚洲夜晚福利在线观看| 亚洲性视频网址| 国产精品一久久香蕉国产线看观看| 国产一区二区精品丝袜| 美女福利视频一区| 国产精品影片在线观看| 精品欧美一区二区三区| 国产精品成人aaaaa网站| 成人久久一区二区三区| 亚洲亚裔videos黑人hd| 久久国产一区二区三区| 欧美午夜电影在线| 91久久精品一区| 精品综合久久久久久97| 狠狠躁夜夜躁久久躁别揉| 国产丝袜一区二区三区免费视频| 亚洲开心激情网| 国产丝袜精品第一页| 亚洲精品www| 色婷婷**av毛片一区| 欧美日韩午夜激情| 91久久夜色精品国产网站| 国产在线视频不卡| 亚洲三级 欧美三级| 高清一区二区三区日本久| 亚洲福利视频专区| 91久久精品一区| 日韩av在线影视| 国产精品一区久久久| 欧美黄色免费网站| 国产69精品久久久| 成人国产精品免费视频| 午夜免费久久久久| 不用播放器成人网| 在线精品高清中文字幕| 日韩久久精品电影| 精品女同一区二区三区在线播放| 久久手机免费视频| 中文字幕精品av| 亚洲香蕉成人av网站在线观看| 午夜精品一区二区三区视频免费看| 国产欧美一区二区三区久久人妖| 91成人天堂久久成人| 91精品视频免费看| 成人免费视频xnxx.com| 中文字幕一精品亚洲无线一区| 91国偷自产一区二区三区的观看方式| 久久av红桃一区二区小说| 亚洲国产一区二区三区在线观看| 日韩乱码在线视频| 午夜精品久久久久久久99热浪潮| 久久久久久噜噜噜久久久精品| 亚洲欧洲黄色网| 亚洲一区二区免费在线| 色综合五月天导航| 久久中文字幕国产| 精品久久久久久久久久久| 欧美激情伊人电影| 国语自产精品视频在线看| 亚洲人成五月天| 国产精品自产拍在线观看| 91在线视频精品| 亚洲人成在线一二| 91午夜在线播放| 国产美女久久久| 欧美日韩国产第一页| 日本精品久久电影| 亚洲美女黄色片| 在线观看欧美成人| 国产一区二区丝袜| 久久精品国产2020观看福利| 美女精品久久久| 亚洲精选中文字幕| 欧美电影免费观看高清| 91高潮精品免费porn| 热99精品只有里视频精品| 欧美高清在线视频观看不卡| 欧美日韩一区二区在线| 亚洲美女在线视频| 久久久久久久一区二区三区| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品久久久久久久天堂| 亚洲国产欧美一区二区三区同亚洲| 9.1国产丝袜在线观看| 91网在线免费观看| 91久久久久久久久久久| 日韩欧美成人精品| 欧美成人精品在线| 亚洲天堂av在线播放| 亚洲视频电影图片偷拍一区| 国产日韩欧美夫妻视频在线观看| 波霸ol色综合久久| 亚洲精品一区二三区不卡| 国产精品吊钟奶在线| 日韩av影院在线观看| 欧美性一区二区三区| 蜜臀久久99精品久久久无需会员| 午夜精品一区二区三区在线播放| 亚洲精品xxxx| 欧美高清在线视频观看不卡| 91po在线观看91精品国产性色| 欧美成人午夜视频| 2019中文字幕在线免费观看| 国产精品一区二区三区在线播放| 欧美黑人国产人伦爽爽爽| 黄色一区二区在线| 亚洲欧洲av一区二区| 亚洲福利在线视频| 日韩中文字幕视频| 国产亚洲视频在线观看| 国产精品视频精品| 欧美一区深夜视频| 4438全国成人免费| 国产精品一区久久久| 亚洲欧洲高清在线| 久久精品电影一区二区| 动漫精品一区二区| 成人免费高清完整版在线观看| 人体精品一二三区| 日本成熟性欧美| 日韩在线视频观看| 91精品国产高清自在线看超| 欧美黑人xxxⅹ高潮交| 国产精品视频不卡| 在线播放精品一区二区三区| 欲色天天网综合久久| 欧美在线视频免费播放| 欧美激情在线一区| 久久97精品久久久久久久不卡| 欧美精品videos性欧美| 亚洲xxxx在线| 午夜精品久久久久久久男人的天堂| 国产精品中文字幕在线| 97视频在线观看免费| 欧美日韩999| 日韩电影免费在线观看| 国产精品视频成人| 欧美xxxx做受欧美| 亚洲电影在线看| 亚洲毛片在线免费观看| 亚洲午夜未满十八勿入免费观看全集| 久久伊人精品天天| 国内精品一区二区三区四区| 久久久久久12| 黄网动漫久久久| 成人免费午夜电影| 红桃av永久久久| 亚洲成人精品久久久| 亚洲最新在线视频| 日韩精品在线观| 欧美日本在线视频中文字字幕| 久久欧美在线电影| 日韩精品在线观看一区二区| 国产日韩在线亚洲字幕中文| 久久久久久久久久婷婷| 欧美性猛交99久久久久99按摩| 日韩欧美一区二区在线| 欧美大片欧美激情性色a∨久久| 亚洲一二在线观看| 亚洲欧美一区二区三区四区| 国产精品高清免费在线观看| 91精品国产综合久久香蕉的用户体验|