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

Java設(shè)計(jì)模式之享元模式示例詳解

 更新時(shí)間:2022年03月03日 14:57:35   作者:溫故知新之java  
享元模式(FlyWeight?Pattern),也叫蠅量模式,運(yùn)用共享技術(shù),有效的支持大量細(xì)粒度的對(duì)象,享元模式就是池技術(shù)的重要實(shí)現(xiàn)方式。本文將通過示例詳細(xì)講解享元模式,感興趣的可以了解一下

定義

享元模式(FlyWeight Pattern),也叫蠅量模式,運(yùn)用共享技術(shù),有效的支持大量細(xì)粒度的對(duì)象,享元模式就是池技術(shù)的重要實(shí)現(xiàn)方式。

原理類圖

  • Flyweight :抽象的享元角色,他是抽象的產(chǎn)品類,同時(shí)他會(huì)定義出對(duì)象的內(nèi)部狀態(tài)和外部狀態(tài)
  • ConcreteFlyweight :是具體的享元角色,具體的產(chǎn)品類,實(shí)現(xiàn)抽象角色,實(shí)現(xiàn)具體的業(yè)務(wù)邏輯
  • UnsharedConcreteFlyweight :不可共享的角色,這個(gè)角色也可能出現(xiàn)在享元模式中
  • FlyweightFactory :享元工廠類,用于構(gòu)建一個(gè)池的容器,同時(shí)在享元工廠里會(huì)提供公共方法 (從池子里獲取對(duì)象,獲取池子里的對(duì)象總數(shù),根據(jù)key獲取對(duì)象,,)
  • Client:客戶端了,使用享元模式去完成業(yè)務(wù)邏輯

案例

需求

我們接了一個(gè)小型的外包項(xiàng)目,給客戶老王做一個(gè)產(chǎn)品展示網(wǎng)頁,老王的朋友們感覺效果不錯(cuò),也希望做這樣的產(chǎn)品展示網(wǎng)頁,但是他們要求都有些不同

1)有客戶要求網(wǎng)頁以新聞的形式發(fā)布

2)有客戶要求網(wǎng)頁以博客的形式發(fā)布

3)有客戶希望網(wǎng)頁以微信公眾號(hào)的形式發(fā)布

方案:享元模式

定義網(wǎng)站用戶類

public class User {
    private String name;

    public User(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

定義網(wǎng)站抽象類——享元角色

public abstract class Website {
    public abstract void show(User user);
}

定義具體的網(wǎng)站類——具體的享元角色

public class ConcreteWebsite extends Website{
    // 網(wǎng)站的發(fā)布形式
    private String type;

    public ConcreteWebsite(String type){
        this.type = type;
    }

    @Override
    public void show(User user) {
        System.out.println("以" + type + "形式發(fā)布網(wǎng)站");
        System.out.println("網(wǎng)站的用戶名是:" + user.getName());
    }
}

定義網(wǎng)站工廠類——享元工廠類

public class WebsiteFactory {
    // 創(chuàng)建HashMap,充當(dāng)池的角色
    private HashMap<String, ConcreteWebsite> pool = new HashMap<String, ConcreteWebsite>();

    // 根據(jù)類型判斷,獲取池子里的對(duì)象
    public Website getWebsite(String type){
        if(!pool.containsKey(type)){
            pool.put(type,new ConcreteWebsite(type));
        }
        return pool.get(type);
    }

    // 獲取池子里的對(duì)象總數(shù)
    public int getWebsiteCount(){
        System.out.println("當(dāng)前池子里的對(duì)象總數(shù):" + pool.size());
        return pool.size();
    }
}

定義客戶端測試類

public class Client {
    public static void main(String[] args) {
        //創(chuàng)建一個(gè)享元工廠
        WebsiteFactory websiteFactory = new WebsiteFactory();
        Website news = websiteFactory.getWebsite("新聞");
        news.show(new User("老李"));
        Website wechat = websiteFactory.getWebsite("博客");
        wechat.show(new User("老高"));
        websiteFactory.getWebsiteCount();
        Website wechat1 = websiteFactory.getWebsite("微信");
        wechat.show(new User("老沈"));
        websiteFactory.getWebsiteCount();
    }
}

查看測試結(jié)果

分析

通過一個(gè)工廠類來根據(jù)不同類型的需求,從而生成對(duì)應(yīng)的具體的享元對(duì)象,實(shí)現(xiàn)了需求。其中享元對(duì)象的信息分為兩個(gè)部分,內(nèi)部狀態(tài)和外部狀態(tài)。內(nèi)部對(duì)象是指對(duì)象共享出來的信息,存儲(chǔ)在享元對(duì)象內(nèi)部,不隨著環(huán)境的改變而改變,外部對(duì)象隨著環(huán)境的改變而改變,不可共享的狀態(tài)。

總結(jié)

優(yōu)勢

節(jié)省內(nèi)存空間,重復(fù)對(duì)象需要被頻繁創(chuàng)建的時(shí)候,享元模式由于只會(huì)被創(chuàng)建一次,所以對(duì)系統(tǒng)的內(nèi)存空間的需求大大減小

提高使用效率,對(duì)于可重復(fù)的對(duì)象只創(chuàng)建一次,再次訪問時(shí)直接從池子里拿,相應(yīng)速度更快,效率也會(huì)更高局限性享元模式會(huì)提高

劣勢

享元模式會(huì)提高系統(tǒng)的復(fù)雜度,享元模式需要有一個(gè)工廠類加以控制,如果盲目使用,會(huì)提高系統(tǒng)邏輯的復(fù)雜度

使用場景

享元模式最經(jīng)典的使用場景就是我們各類池技術(shù)了

系統(tǒng)中有大量對(duì)象的時(shí)候,這些對(duì)象消耗大量內(nèi)存,可以考慮使用享元模式

到此這篇關(guān)于Java設(shè)計(jì)模式之享元模式示例詳解的文章就介紹到這了,更多相關(guān)Java享元模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC統(tǒng)一異常處理實(shí)例代碼

    SpringMVC統(tǒng)一異常處理實(shí)例代碼

    這篇文章主要介紹了SpringMVC統(tǒng)一異常處理實(shí)例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • dubbo自定義異常的完整步驟與測試

    dubbo自定義異常的完整步驟與測試

    最近在項(xiàng)目上遇到一個(gè)有關(guān)dubbo的問題,想著給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于dubbo自定義異常的完整步驟與測試的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Spring Boot 中實(shí)現(xiàn)跨域的多種方式小結(jié)

    Spring Boot 中實(shí)現(xiàn)跨域的多種方式小結(jié)

    Spring Boot提供了多種方式來實(shí)現(xiàn)跨域請求,開發(fā)者可以根據(jù)具體需求選擇適合的方法,在配置時(shí),要確保不僅考慮安全性,還要兼顧應(yīng)用的靈活性和性能,本文給大家介紹Spring Boot 中實(shí)現(xiàn)跨域的多種方式,感興趣的朋友一起看看吧
    2024-01-01
  • Spring Cloud Gateway(讀取、修改 Request Body)的操作

    Spring Cloud Gateway(讀取、修改 Request Body)的操作

    這篇文章主要介紹了Spring Cloud Gateway(讀取、修改 Request Body)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Java使用IO流實(shí)現(xiàn)音頻的剪切和拼接

    Java使用IO流實(shí)現(xiàn)音頻的剪切和拼接

    這篇文章主要為大家詳細(xì)介紹了Java使用IO流實(shí)現(xiàn)音頻的剪切和拼接,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java?天生就是多線程

    Java?天生就是多線程

    這篇文章主要介紹了Java天生就是多線程,程序天生就是多線程程序,因?yàn)閳?zhí)行main()方法的是一個(gè)名稱為main的線程,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-07-07
  • java:無法訪問org.springframework.boot.SpringApplication

    java:無法訪問org.springframework.boot.SpringApplication

    本文主要介紹了java:無法訪問org.springframework.boot.SpringApplication,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • java8 stream 如何打印數(shù)據(jù)元素

    java8 stream 如何打印數(shù)據(jù)元素

    這篇文章主要介紹了java8 stream 如何打印數(shù)據(jù)元素,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • @Transactional注解異常報(bào)錯(cuò)之多數(shù)據(jù)源詳解

    @Transactional注解異常報(bào)錯(cuò)之多數(shù)據(jù)源詳解

    這篇文章主要介紹了@Transactional注解異常報(bào)錯(cuò)之多數(shù)據(jù)源詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java中Spring MVC接收表單數(shù)據(jù)的常用方法

    Java中Spring MVC接收表單數(shù)據(jù)的常用方法

    Spring MVC是Spring框架中的一個(gè)模塊,用于開發(fā)基于MVC(Model-View-Controller)架構(gòu)的Web應(yīng)用程序,它提供了一種輕量級(jí)的、靈活的方式來構(gòu)建Web應(yīng)用,同時(shí)提供了豐富的功能和特性,本文給大家介紹了Spring MVC接收表單數(shù)據(jù)的方法,需要的朋友可以參考下
    2024-05-05

最新評(píng)論

龙里县| 洪雅县| 潍坊市| 二连浩特市| 开原市| 中山市| 承德县| 武夷山市| 汉沽区| 长宁区| 丹凤县| 南乐县| 广南县| 永靖县| 宜兰市| 崇文区| 天峻县| 九江市| 响水县| 镇雄县| 琼海市| 皋兰县| 舞阳县| 丽水市| 堆龙德庆县| 通海县| 车致| 贵定县| 陵川县| 泌阳县| 朝阳区| 蒙阴县| 吴堡县| 望奎县| 南平市| 瑞金市| 资中县| 临高县| 龙州县| 临沧市| 永善县|