成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

設(shè)計模式j(luò)ava實現(xiàn)代碼 設(shè)計模式j(luò)ava書

java 設(shè)計模式(工廠方法)

面向抽象(抽象類或接口)編程。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:申請域名、虛擬主機、營銷軟件、網(wǎng)站建設(shè)、烏翠網(wǎng)站維護、網(wǎng)站推廣。

IWorkFactory studentWorkFactory = new StudentWorkFactory(); 注意:類型是接口類型,即抽象工廠,抽象工廠生產(chǎn)的是抽象產(chǎn)品,而new的則是具體工廠,是由子類實現(xiàn)的,具體工廠生產(chǎn)具體產(chǎn)品。面向抽象的好處:1.在設(shè)計抽象的時候不用管具體的實現(xiàn),只要定義接口知道它用來干什么就行,這樣,我只需要知道抽象接口就能繼續(xù)下面的開發(fā)設(shè)計工作了,而不用事先設(shè)計具體的實現(xiàn)內(nèi)容;2. 可以擴展多個子類實現(xiàn)抽象接口,更利于系統(tǒng)后期的擴展,而對原系統(tǒng)不造成任何影響,即:開-閉原則。

TeacherWork tt = new TeacherWork(); 不用說就是面向具體實現(xiàn)類編程,缺點就是擴展性不好,對系統(tǒng)后期維護擴展影響較大。

舉個簡單的例子:

假如在系統(tǒng)的A.java中代碼中使用了TeacherWork 類型對象,是滿足了目前軟件的需求,但是,如果有一天需求變化了需要一個StudentWork 類型對象,該怎么辦?只能修改A.java類來滿足這樣的修改需求。這樣就影響了原來系統(tǒng)結(jié)構(gòu)穩(wěn)定性,需要重新調(diào)試和測試,而這帶來的維護成本是非常大的,有時可能還會帶來系統(tǒng)錯誤,而影響系統(tǒng)運行。

如果在A.java類中應(yīng)用Work接口類型就不會存在這種問題,A.java不需要任何修改,只需要修改注入到A中的Work接口的具體實現(xiàn)類即可。

面向抽象編程的好處就在于對系統(tǒng)維護和擴展上,即在不影響原系統(tǒng)穩(wěn)定運行的基礎(chǔ)上增加新的擴展行為,即要符合“開-閉”原則??赡軙虼硕ヒ欢ǖ男蕟栴},但是對于后期的維護成本來說,這個可以忽略不計。 推薦你一本好書:《軟件秘笈-設(shè)計模式那點事》其中講解的設(shè)計模式很到位,還有每個模式的靜態(tài)類圖和JDK中設(shè)計模式的具體分析講解,讀了收獲一定很大。祝你成功!

java設(shè)計模式 觀察者模式 代碼

第一個

public interface RandomNumberListener {//接口

public void numberChanged(double d);

}

第二個

public class Consol implements RandomNumberListener{

@Override

public void numberChanged(double d) {

System.out.println(d);

}

}

第三個

public class SwingWindow

extends JFrame

implements RandomNumberListener{//觀察者

private JLabel label = new JLabel();

public SwingWindow(){

this.getContentPane().add( label);

this.setSize(300,200);

this.setVisible(true);

}

@Override

public void numberChanged(double d) {

label.setText(String.valueOf(d));

}

}

第四個

public class RandomNumber {//業(yè)務(wù)

private double r;

private ListRandomNumberListener listeners = new ArrayListRandomNumberListener();

//添加所有觀察者

public void addRandomNumberListener(RandomNumberListener lis){

listeners.add(lis);

}

public void random(){

r = Math.random();

//數(shù)據(jù)發(fā)生改變,通知所有的觀察者

for (RandomNumberListener lis : listeners) {

lis.numberChanged(r);

}

}

}

第五個

public class Test {

public static void main(String[] args) throws InterruptedException{

RandomNumber rn = new RandomNumber();

SwingWindow sw = new SwingWindow();

Consol c = new Consol();

rn.addRandomNumberListener(sw);

rn.addRandomNumberListener(c);

while(true){

rn.random();

Thread.sleep(new Random().nextInt(3000)+1000L);

}

}

}

Java設(shè)計模式,需要用到兩種設(shè)計模式,急需!

工廠模式:

Product代碼:

public interface Work {

void doWork();

}

ConcreteProduct代碼:

public class StudentWork implements Work {

public void doWork() {

System.out.println("學(xué)生做作業(yè)!");

}

}

public class TeacherWork implements Work {

public void doWork() {

System.out.println("老師審批作業(yè)!");

}

}

Creator代碼:

public interface IWorkFactory {

Work getWork();

}

ConcreteCreator代碼:

public class StudentWorkFactory implements IWorkFactory {

public Work getWork() {

return new StudentWork();

}

}

public class TeacherWorkFactory implements IWorkFactory {

public Work getWork() {

return new TeacherWork();

}

}

Test代碼:

public class Test {

public static void main(String[] args) {

IWorkFactory studentWorkFactory = new StudentWorkFactory();

studentWorkFactory.getWork().doWork();

IWorkFactory teacherWorkFactory = new TeacherWorkFactory();

teacherWorkFactory.getWork().doWork();

}

}

追問一下,給你寫第二個。

急求java設(shè)計模式,要求用到兩種設(shè)計模式 求詳細(xì)代碼

.餓漢式單例類

//餓漢式單例類.在類初始化時,已經(jīng)自行實例化

public class Singleton1 {

//私有的默認(rèn)構(gòu)造子

private Singleton1() {}

//已經(jīng)自行實例化

private static final Singleton1 single = new Singleton1();

//靜態(tài)工廠方法

public static Singleton1 getInstance() {

return single;

}

}

2.懶漢式單例類

//懶漢式單例類.在第一次調(diào)用的時候?qū)嵗?/p>

public class Singleton2 {

//私有的默認(rèn)構(gòu)造子

private Singleton2() {}

//注意,這里沒有final

private static Singleton2 single=null;

//靜態(tài)工廠方法

public synchronized static Singleton2 getInstance() {

if (single == null) {

single = new Singleton2();

}

return single;

}

}

//對懶漢式單例的改進(錯誤的改進)

//實際上,只有在第一次創(chuàng)建對象的時候需要加鎖,之后就不需要了 ,這樣可以提升性能

public synchronized static Singleton2 getInstance() {

if (instance == null) {

synchronized(instance){ //鎖住當(dāng)前實例對象

if(instance == null){

instance = new Singleton2();

}

}

}

return instance;

}

錯誤原因:

aA、B線程同時進入了第一個if判斷

bA首先進入synchronized塊,由于instance為null,所以它執(zhí)行instance = new Singleton();

c由于JVM內(nèi)部的優(yōu)化機制,JVM先畫出了一些分配給Singleton實例的空白內(nèi)存,并賦值給instance成員(注意此時JVM沒有開始初始化這個實例),然后A離開了synchronized塊。

dB進入synchronized塊,由于instance此時不是null,因此它馬上離開了synchronized塊并將結(jié)果返回給調(diào)用該方法的程序。

e此時B線程打算使用Singleton實例,卻發(fā)現(xiàn)它沒有被初始化,于是錯誤發(fā)生了。

正確改進(使用內(nèi)部類):

JVM內(nèi)部的機制能夠保證當(dāng)一個類被加載的時候,這個類的加載過程是線程互斥的,JVM能夠幫我們保證instance只被創(chuàng)建一次,

并且會保證把賦值給instance的內(nèi)存初始化完畢,這樣我們就不用擔(dān)心上面的問題。

同時該方法也只會在第一次調(diào)用的時候使用互斥機制,這樣就解決了低性能問題

public?class?Singleton?{??

??

/*?私有構(gòu)造方法,防止被實例化?*/??

private?Singleton(){

}

/*?此處使用一個內(nèi)部類來維護單例?*/??

private?static?class?SingletonFactory?{??

private?static?Singleton?instance?=?new?Singleton();??

}

/*?獲取實例?*/??

public?static?Singleton?getInstance()?{??

return?SingletonFactory.instance;??

}

/*?如果該對象被用于序列化,可以保證對象在序列化前后保持一致?*/??

public?Object?readResolve()?{??

return?getInstance();??

}

}

其實說它完美,也不一定,如果在構(gòu)造函數(shù)中拋出異常,實例將永遠得不到創(chuàng)建,也會出錯????

第二種改進:

因為我們只需要在創(chuàng)建類的時候進行同步,所以只要將創(chuàng)建和getInstance()分開,

單獨為創(chuàng)建加synchronized關(guān)鍵字,也是可以的

public class Singleton {

private static Singleton instance=null;

private Singleton(){}

private static synchronized void Init(){

if(instance==null)

instance=new Singletion();

}

public static Singleton getInstance(){

if(instance==null){

Init();

}

return instance;

}

}

3.登記式單例類

import java.util.HashMap;

import java.util.Map;

//登記式單例類.

//類似Spring里面的方法,將類名注冊,下次從里面直接獲取。

public class Singleton3 {

private static MapString,Singleton3 map = new HashMapString,Singleton3();

static{

Singleton3 single = new Singleton3();

map.put(single.getClass().getName(), single);

}

//保護的默認(rèn)構(gòu)造子

protected Singleton3(){}

//靜態(tài)工廠方法,返還此類惟一的實例

public static Singleton3 getInstance(String name) {

if(name == null) {

name = Singleton3.class.getName();

System.out.println("name == null"+"---name="+name);

}

if(map.get(name) == null) {

try {

map.put(name, (Singleton3) Class.forName(name).newInstance());

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

return map.get(name);

}

//一個示意性的商業(yè)方法

public String about() {

return "Hello, I am RegSingleton.";

}

public static void main(String[] args) {

Singleton3 single3 = Singleton3.getInstance(null);

System.out.println(single3.about());

}

}

當(dāng)前名稱:設(shè)計模式j(luò)ava實現(xiàn)代碼 設(shè)計模式j(luò)ava書
URL網(wǎng)址:http://jinyejixie.com/article20/doscdco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護微信公眾號、小程序開發(fā)網(wǎng)站制作、網(wǎng)站內(nèi)鏈、虛擬主機

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
泉州市| 临夏市| 涡阳县| 南丹县| 德化县| 张家港市| 永福县| 巴林右旗| 钟山县| 景谷| 河东区| 扶余县| 如东县| 如东县| 东城区| 香格里拉县| 昌宁县| 屏南县| 镶黄旗| 马龙县| 分宜县| 巴林右旗| 临夏县| 章丘市| 泽普县| 阿拉善右旗| 辽宁省| 桃源县| 会理县| 军事| 固始县| 镇坪县| 榆树市| 苍梧县| 皋兰县| 视频| 丽水市| 始兴县| 乐至县| 乐昌市| 连城县|