亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JAVA中常用的設(shè)計(jì)模式:單例模式,工廠模式,觀察者模式

 更新時(shí)間:2020年04月07日 08:49:00   作者:涼白開dream  
設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐,通常被有經(jīng)驗(yàn)的面向?qū)ο蟮能浖_發(fā)人員所采用。設(shè)計(jì)模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。這些解決方案是眾多軟件開發(fā)人員經(jīng)過相當(dāng)長的一段時(shí)間的試驗(yàn)和錯(cuò)誤總結(jié)出來的。

1.單例模式

每個(gè)類只能創(chuàng)建一個(gè)實(shí)例對(duì)象

Java Singleton模式主要作用是保證在Java應(yīng)用程序中,一個(gè)類Class只有一個(gè)實(shí)例存在。 使用Singleton的好處還在于可以節(jié)省內(nèi)存,因?yàn)樗拗屏藢?shí)例的個(gè)數(shù),有利于Java垃圾回收(garbage collection)。

好處:

第一、控制資源的使用,通過線程同步來控制資源的并發(fā)訪問;

第二、控制實(shí)例產(chǎn)生的數(shù)量,達(dá)到節(jié)約資源的目的。

第三、作為通信媒介使用,也就是數(shù)據(jù)共享,它可以在不建立直接關(guān)聯(lián)的條件下,讓多個(gè)不相關(guān)的兩個(gè)線程或者進(jìn)程之間實(shí)現(xiàn)通信。

應(yīng)用場景:在線統(tǒng)計(jì)人數(shù)


public class SingleTon {

private SingleTon(){}

public static volatile SingleTon instance=null;
public static SingleTon getInstance( ){
synchronized (SingleTon.class){
if(instance==null){
instance=new SingleTon();
                             }
                }
}
return instance;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
public void getInfo( ){
 System.out.println("name is "+name);
}
public static void main(String[] args) {

SingleTon s1 = SingleTon. getInstance( );
s1. setName( "0000" );

SingleTon s2 = SingleTon. getInstance( );
s2. setName( " 1111" );

s1. getInfo( );

s2.getInfo( );

if(s1 == s2){

System.out.println("是一個(gè)實(shí)例");}
else{
System. out. println("不是一個(gè)實(shí)例");
      }
}

synchronized 關(guān)鍵字,代表這個(gè)方法加鎖,

相當(dāng)于不管哪一個(gè)線程A每次運(yùn)行到這個(gè)方法時(shí),

都要檢查有沒有其它正在用這個(gè)方法的線程B(或者C D等),

有的話要等正在使用這個(gè)方法的線程B(或者C D)運(yùn)行完這個(gè)方法后再運(yùn)行此線程A,

沒有的話,直接運(yùn)行它包括兩種用法:synchronized 方法和 synchronized 塊

2.工廠模式

優(yōu)點(diǎn):

將創(chuàng)建實(shí)例的工作與使用實(shí)例的工作分開,使用者不必關(guān)心類對(duì)象如何創(chuàng)建,明確了職責(zé)。

把初始化實(shí)例時(shí)的工作放到工廠里進(jìn)行,使代碼更容易維護(hù)。 更符合面向?qū)ο蟮脑瓌t,面向接口編程,而不是面向?qū)崿F(xiàn)編程。

缺點(diǎn):

由于工廠類集中了所有產(chǎn)品創(chuàng)建邏輯,一旦不能正常工作,整個(gè)系統(tǒng)都要受到影響。

要新增產(chǎn)品類的時(shí)候,就要修改工廠類的代碼,違反了開放封閉原則(對(duì)擴(kuò)展的開放,對(duì)修改的關(guān)閉)。

簡單工廠模式由于使用了靜態(tài)工廠方法,靜態(tài)方法不能被繼承和重寫,會(huì)造成工廠角色無法形成基于繼承的等級(jí)結(jié)構(gòu)。

public interface Sender{
public void Send();
}
public class MailSender implements Sender{
@0verride
public void Send( ) {
System.out.println("this is mailsender!");
}
public class SmsSender implements Sender{
@override
public void Send( ) {
System.out.println("this is sms sender!");
}
public class SenderFactory{
public Sender produce(String type){
        if("mail".equals(type)){
            return new MailSender();
        }else if("sms".equals(type)){
            return new SmsSender();
        }else {
            System.out.println("請(qǐng)輸入正確的類型!");
            return  null;
        }
        //多工廠模式
//        public Sender produceMail(){
//            return new MailSender();
//        }
//        public Sender produceSms(){
//            return new SmsSender();
//        }
    }
}

3觀察者模式

簡單地說,觀察者模式定義了一個(gè)一對(duì)多的依賴關(guān)系,讓一個(gè)或多個(gè)觀察者對(duì)象監(jiān)聽一個(gè)主題對(duì)象。這樣一來,當(dāng)被觀察者狀態(tài)發(fā)生改變時(shí),需要通知相應(yīng)的觀察者,使這些觀察者對(duì)象能夠自動(dòng)更新。例如:GUI中的事件處理機(jī)制采用的就是觀察者模式.

//定義被觀察者所具有的接口
public interface Observable {
public void register0bserve(Observer observer);//注冊(cè)為一個(gè)觀察者
public void remove0bserve(Observer observer);//取消觀察 者
public void notifyobserves( );//通知所有觀察者更新信息
}

import com . example. demo . interfaceTest . observable;
import com. example . demo. interfaceTest Observer;
gimport java.util.Vector ;
public class Cup implements Observable {
//被觀察者維護(hù)的一個(gè)觀察者對(duì)象列表
private Vector<observer> vector = new Vector<observer>();
private float price;
public Cup(float price) {
this.price = price;
}
public float getPrice() {
return price;
public void setPrice(float price) {
this.price = price;
notifyobserves( ); //修改價(jià)格時(shí)通知觀察者
}
@override
public void register0bserve(Observer observer) {
/ /注冊(cè)觀察者
vector . add( observer);
}
@override
public void removeObserve(Observer observer) {
//取消觀察者
vector . remove(observer);
}
@override
public void notifyObserves() {
//實(shí)現(xiàn)通知所有的觀察者對(duì)象
for (Observer observer:vector){
observer update(price);
       }
}
package com. example. demo .interfaceTest
public interface observer {
public void update(float price);
}
package com. example . demo. test;
import com. example. demo. interfaceTestobserver:
public class Person implements Observer
private String name ;
public Person(String name ){
this.name = name ;
aoverride
public void update(float price) {
System. out. println(name+"關(guān)注的杯子的價(jià)格已更新為: "+price);
}
public static void main(String[] args) {
Cup cup
= new Cup( price: 3000);
Person p1 = new Person( name: "老哥”);
Person p2 = new Person( name:
"小弟”);
cup. registerObserve(p1);
cup. registerObserve(p2);
System. out. println("第1次修改價(jià)格");
cup. setPrice(2500);
System. out. println( "第2次修改價(jià)格" );
cup. setPrice(2000);
System. out. println("第3次修改價(jià)格");
cup. setPrice(1500);
//移除2號(hào)觀察者
cup. removeObserve(p2);
System. out. println("第4次修改價(jià)格”);
cup . setPrice(1000);
}

以上就是JAVA中常用的設(shè)計(jì)模式:單例模式,工廠模式,觀察者模式的詳細(xì)內(nèi)容,更多關(guān)于JAVA單例模式,工廠模式,觀察者模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java設(shè)計(jì)模式之Strategy模式

    Java設(shè)計(jì)模式之Strategy模式

    Strategy模式即策略模式,就是將一個(gè)算法的不同實(shí)現(xiàn)封裝成一個(gè)個(gè)單獨(dú)的類,這些類實(shí)現(xiàn)同一個(gè)接口,使用者直接使用該接口來訪問具體的算法。這個(gè)樣子,使用者就可以使用不同的算法來實(shí)現(xiàn)業(yè)務(wù)邏輯了。
    2016-07-07
  • java自定義切面增強(qiáng)方式(關(guān)于自定義注解aop)

    java自定義切面增強(qiáng)方式(關(guān)于自定義注解aop)

    這篇文章主要介紹了java自定義切面增強(qiáng)方式(關(guān)于自定義注解aop),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java多線程中的ThreadLocal應(yīng)用場景及問題解讀

    Java多線程中的ThreadLocal應(yīng)用場景及問題解讀

    這篇文章主要介紹了Java多線程中的ThreadLocal應(yīng)用場景及問題解讀,ThreadLocal這個(gè)類在多線程并發(fā)中主要的使用場景是什么呢,我們都知道多線程并發(fā)問題實(shí)際就是多個(gè)線程對(duì)公共資源訪問和修改問題,需要的朋友可以參考下
    2023-12-12
  • 關(guān)于java中可變長參數(shù)的定義及使用方法詳解

    關(guān)于java中可變長參數(shù)的定義及使用方法詳解

    下面小編就為大家?guī)硪黄P(guān)于java中可變長參數(shù)的定義及使用方法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • 實(shí)例詳解Java實(shí)現(xiàn)圖片與base64字符串之間的轉(zhuǎn)換

    實(shí)例詳解Java實(shí)現(xiàn)圖片與base64字符串之間的轉(zhuǎn)換

    這篇文章主要介紹了Java實(shí)現(xiàn)圖片與base64字符串之間的轉(zhuǎn)換實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下
    2016-12-12
  • java往php傳數(shù)據(jù)操作方法

    java往php傳數(shù)據(jù)操作方法

    在本篇內(nèi)容里小編給大家分享的是關(guān)于java往php傳數(shù)據(jù)操作方法和技巧,需要的朋友們可以跟著學(xué)習(xí)下。
    2018-12-12
  • Log4j如何屏蔽某個(gè)類的日志打印

    Log4j如何屏蔽某個(gè)類的日志打印

    這篇文章主要介紹了Log4j如何屏蔽某個(gè)類的日志打印,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot外部化配置示例解析

    SpringBoot外部化配置示例解析

    這篇文章主要介紹了SpringBoot外部化配置示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Java+TestNG接口自動(dòng)化入門詳解

    Java+TestNG接口自動(dòng)化入門詳解

    本文主要介紹了Java+TestNG接口自動(dòng)化入門,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java利用Geotools實(shí)現(xiàn)不同坐標(biāo)系之間坐標(biāo)轉(zhuǎn)換

    Java利用Geotools實(shí)現(xiàn)不同坐標(biāo)系之間坐標(biāo)轉(zhuǎn)換

    GeoTools 是一個(gè)開源的 Java GIS 工具包,可利用它來開發(fā)符合標(biāo)準(zhǔn)的地理信息系統(tǒng)。本文將利用工具包Geotools實(shí)現(xiàn)不同坐標(biāo)系之間坐標(biāo)轉(zhuǎn)換,感興趣的可以了解一下
    2022-08-08

最新評(píng)論