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

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

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

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

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

TeacherWork tt = new TeacherWork(); 不用說(shuō)就是面向具體實(shí)現(xiàn)類(lèi)編程,缺點(diǎn)就是擴(kuò)展性不好,對(duì)系統(tǒng)后期維護(hù)擴(kuò)展影響較大。

舉個(gè)簡(jiǎn)單的例子:

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

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

面向抽象編程的好處就在于對(duì)系統(tǒng)維護(hù)和擴(kuò)展上,即在不影響原系統(tǒng)穩(wěn)定運(yùn)行的基礎(chǔ)上增加新的擴(kuò)展行為,即要符合“開(kāi)-閉”原則。可能會(huì)因此而失去一定的效率問(wèn)題,但是對(duì)于后期的維護(hù)成本來(lái)說(shuō),這個(gè)可以忽略不計(jì)。 推薦你一本好書(shū):《軟件秘笈-設(shè)計(jì)模式那點(diǎn)事》其中講解的設(shè)計(jì)模式很到位,還有每個(gè)模式的靜態(tài)類(lèi)圖和JDK中設(shè)計(jì)模式的具體分析講解,讀了收獲一定很大。祝你成功!

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

第一個(gè)

public interface RandomNumberListener {//接口

public void numberChanged(double d);

}

第二個(gè)

public class Consol implements RandomNumberListener{

@Override

public void numberChanged(double d) {

System.out.println(d);

}

}

第三個(gè)

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));

}

}

第四個(gè)

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);

}

}

}

第五個(gè)

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è)計(jì)模式,需要用到兩種設(shè)計(jì)模式,急需!

工廠模式:

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();

}

}

追問(wèn)一下,給你寫(xiě)第二個(gè)。

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

.餓漢式單例類(lèi)

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

public class Singleton1 {

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

private Singleton1() {}

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

private static final Singleton1 single = new Singleton1();

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

public static Singleton1 getInstance() {

return single;

}

}

2.懶漢式單例類(lèi)

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

public class Singleton2 {

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

private Singleton2() {}

//注意,這里沒(méi)有final

private static Singleton2 single=null;

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

public synchronized static Singleton2 getInstance() {

if (single == null) {

single = new Singleton2();

}

return single;

}

}

//對(duì)懶漢式單例的改進(jìn)(錯(cuò)誤的改進(jìn))

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

public synchronized static Singleton2 getInstance() {

if (instance == null) {

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

if(instance == null){

instance = new Singleton2();

}

}

}

return instance;

}

錯(cuò)誤原因:

aA、B線程同時(shí)進(jìn)入了第一個(gè)if判斷

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

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

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

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

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

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

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

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

public?class?Singleton?{??

??

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

private?Singleton(){

}

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

private?static?class?SingletonFactory?{??

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

}

/*?獲取實(shí)例?*/??

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

return?SingletonFactory.instance;??

}

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

public?Object?readResolve()?{??

return?getInstance();??

}

}

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

第二種改進(jìn):

因?yàn)槲覀冎恍枰趧?chuàng)建類(lèi)的時(shí)候進(jìn)行同步,所以只要將創(chuàng)建和getInstance()分開(kāi),

單獨(dú)為創(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.登記式單例類(lèi)

import java.util.HashMap;

import java.util.Map;

//登記式單例類(lèi).

//類(lèi)似Spring里面的方法,將類(lèi)名注冊(cè),下次從里面直接獲取。

public class Singleton3 {

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

static{

Singleton3 single = new Singleton3();

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

}

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

protected Singleton3(){}

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

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);

}

//一個(gè)示意性的商業(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)前名稱(chēng):設(shè)計(jì)模式j(luò)ava實(shí)現(xiàn)代碼 設(shè)計(jì)模式j(luò)ava書(shū)
URL網(wǎng)址:http://muchs.cn/article20/doscdco.html

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

廣告

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

成都定制網(wǎng)站建設(shè)