最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1.單例模式

每個類只能創(chuàng)建一個實例對象

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

好處:

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

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

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

應(yīng)用場景:在線統(tǒng)計人數(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("是一個實例");}
else{
System. out. println("不是一個實例");
      }
}

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

相當于不管哪一個線程A每次運行到這個方法時,

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

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

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

2.工廠模式

優(yōu)點:

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

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

缺點:

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

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

簡單工廠模式由于使用了靜態(tài)工廠方法,靜態(tài)方法不能被繼承和重寫,會造成工廠角色無法形成基于繼承的等級結(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("請輸入正確的類型!");
            return  null;
        }
        //多工廠模式
//        public Sender produceMail(){
//            return new MailSender();
//        }
//        public Sender produceSms(){
//            return new SmsSender();
//        }
    }
}

3觀察者模式

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

//定義被觀察者所具有的接口
public interface Observable {
public void register0bserve(Observer observer);//注冊為一個觀察者
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 {
//被觀察者維護的一個觀察者對象列表
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( ); //修改價格時通知觀察者
}
@override
public void register0bserve(Observer observer) {
/ /注冊觀察者
vector . add( observer);
}
@override
public void removeObserve(Observer observer) {
//取消觀察者
vector . remove(observer);
}
@override
public void notifyObserves() {
//實現(xiàn)通知所有的觀察者對象
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)注的杯子的價格已更新為: "+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次修改價格");
cup. setPrice(2500);
System. out. println( "第2次修改價格" );
cup. setPrice(2000);
System. out. println("第3次修改價格");
cup. setPrice(1500);
//移除2號觀察者
cup. removeObserve(p2);
System. out. println("第4次修改價格”);
cup . setPrice(1000);
}

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

相關(guān)文章

  • Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之貪心算法

    Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之貪心算法

    我們可能在好多地方都會聽到貪心算法這一概念,并且它的算法思想也比較簡單就是說算法只保證局部最優(yōu),進而達到全局最優(yōu)。但我們實際編程的過程中用的并不是很多,究其原因可能是貪心算法使用的條件比較苛刻,所要解決的問題必須滿足貪心選擇性質(zhì)
    2022-02-02
  • SpringBoot調(diào)用外部接口的幾種方式

    SpringBoot調(diào)用外部接口的幾種方式

    SpringBoot應(yīng)用中,調(diào)用外部接口是微服務(wù)架構(gòu)常見需求,本文主要介紹了SpringBoot調(diào)用外部接口的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2024-10-10
  • java MD5加密實現(xiàn)代碼

    java MD5加密實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了java MD5加密實現(xiàn)過程,為大家分享了MD5加密代碼,感興趣的小伙伴們可以參考一下
    2016-08-08
  • JAVA像SQL一樣對List對象集合進行排序

    JAVA像SQL一樣對List對象集合進行排序

    這篇文章主要介紹了JAVA像SQL一樣對List對象集合進行排序的實現(xiàn)方法,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習,感興趣的朋友可以了解下
    2020-07-07
  • java實現(xiàn)文件斷點續(xù)傳下載功能

    java實現(xiàn)文件斷點續(xù)傳下載功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)文件斷點續(xù)傳下載功能的具體代碼,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Java 實現(xiàn)完整功能的學(xué)生管理系統(tǒng)實例

    Java 實現(xiàn)完整功能的學(xué)生管理系統(tǒng)實例

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實現(xiàn)一個完整版學(xué)生管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • 一文講解如何優(yōu)雅的調(diào)試jar包

    一文講解如何優(yōu)雅的調(diào)試jar包

    在現(xiàn)實開發(fā)過程中,現(xiàn)場環(huán)境永遠比開發(fā)環(huán)境復(fù)雜,下面這篇文章主要給大家介紹了關(guān)于如何優(yōu)雅的調(diào)試jar包的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • SpringCloud遠程服務(wù)調(diào)用實戰(zhàn)筆記

    SpringCloud遠程服務(wù)調(diào)用實戰(zhàn)筆記

    本文給大家介紹SpringCloud遠程服務(wù)調(diào)用實戰(zhàn)筆記,本文給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-11-11
  • IDEA中Translation使用及問題解決

    IDEA中Translation使用及問題解決

    本文主要介紹了IDEA中Translation使用及問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2023-06-06
  • java實現(xiàn)大文件分割與合并的實例代碼

    java實現(xiàn)大文件分割與合并的實例代碼

    java實現(xiàn)大文件分割與合并的實例代碼,需要的朋友可以參考一下
    2013-03-03

最新評論

宝兴县| 奉节县| 辽中县| 隆化县| 靖州| 富裕县| 怀仁县| 红河县| 永定县| 榆林市| 无锡市| 莆田市| 随州市| 外汇| 保德县| 台南市| 平罗县| 兴国县| 永平县| 宜春市| 中西区| 凤翔县| 梁山县| 钦州市| 青龙| 佳木斯市| 阿拉尔市| 望谟县| 曲靖市| 伊吾县| 翁牛特旗| 尼玛县| 成安县| 博湖县| 樟树市| 会宁县| 周口市| 客服| 武城县| 信阳市| 迁西县|