享元模式

设计模式之享元模式

享元模式可以解决的问题例子

提出问题:图书馆里有书籍,可以供给老师们阅读,图书馆里的每一个书名只对应着一本书(例如只有一本<金瓶梅>给老师们阅读,不会是多本),也就是说,我们的老师可以重名,但是书籍没有重名的.
用java 表示出第一个”小崔”借阅了图书馆中的<鹿鼎记>和<金瓶梅>
第二个”小崔”借阅了图书馆中的<火影忍者>和<金瓶梅>

分析

两个小崔老师,是两个不同的人,所以我们要生成两个对象,但是他们借阅的<金瓶梅>却是同一本书,金瓶梅应该是同一个对象.

解决

每一次创建书籍的对象的时候,我们通过BookFactory工厂来创建,这个工厂用来判断书籍对象是否已经生成,如果生成过,直接拿来用,没有生成过再创建.如图所示
这里写图片描述

代码例子

Book.java

public class Book {
    String bookName;    //书的名字,在一段时间里不同的老师可以翻阅同一本书,只要书名相同我们就认为同一本书

    public Book(String bookName) {
        super();
        this.bookName = bookName;
    }

    public Book() {
        super();
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }


}

Teacher.java


import java.util.List;

public class Teacher {

    String teacherName; //即使相同的姓名我们都会认为是同一个老师

    List<Book> lBook;   //老师借阅的书籍,一个老师可以看多本书,根据需求所以用List


    public Teacher() {
        super();
    }

    public Teacher(String teacherName) {
        super();
        this.teacherName = teacherName;
    }

    public Teacher(String teacherName, List<Book> lBook) {
        super();
        this.teacherName = teacherName;
        this.lBook = lBook;
    }

    public String getTeacherName() {
        return teacherName;
    }

    public void setTeacherName(String teacherName) {
        this.teacherName = teacherName;
    }

    public List<Book> getlBook() {
        return lBook;
    }

    public void setlBook(List<Book> lBook) {
        this.lBook = lBook;
    }


}

BookFactory.java

import java.util.HashMap;
import java.util.Map;

public class BookFactory {
    //书籍的容器
    private Map<String, Book> pool;
    //创建书籍的工厂,
    public BookFactory() {
        pool = new HashMap<String, Book>();
    }
    //判断这本书是否在容器中出现过
    public Book getBook(String bookName) {
        Book book = pool.get(bookName);
        if (book == null) {
            book = new Book();
            book.setBookName(bookName);
            pool.put(bookName, book);
        }
        return book;
    }

}

测试类CuiTest.java

import java.util.ArrayList;

public class CuiTest {

    public static void main(String[] args) {


        BookFactory bookFactory = new BookFactory();
        Teacher cui = new Teacher("小崔");
        //小崔老师看的书
        ArrayList<Book> cui1Lisst = new ArrayList<Book>();
        Book cui1book1 = bookFactory.getBook("鹿鼎记");
        Book cui1book2 = bookFactory.getBook("金瓶梅");
        cui1Lisst.add(cui1book1);
        cui1Lisst.add(cui1book2);
        cui.setlBook(cui1Lisst);

        //第二个老师也叫小崔
        Teacher cui2 = new Teacher("小崔");
        ArrayList<Book> cui2Lisst = new ArrayList<Book>();
        Book cui2book1 = bookFactory.getBook("火影忍者");
        Book cui2book2 = bookFactory.getBook("金瓶梅");
        cui2Lisst.add(cui2book1);
        cui2Lisst.add(cui2book2);
        cui2.setlBook(cui2Lisst);

        //两个老师虽然都叫小崔,不同的人生成的也是不同的对象
        if(cui==cui2){
            System.out.println("两个小崔来自一个对象");
        }else{
            System.out.println("两个小崔来自不同的对象");
        }

        if(cui1book2==cui2book2){
            System.out.println("两本金瓶梅来自一个对象");
        }else{
            System.out.println("两本金瓶梅来自不同的对象");
        }



    }

}

测试结果
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值