23种设计模式之享元模式

本文介绍了设计模式中的享元模式,包括其结构和工作原理。通过具体的Java代码示例,展示了如何创建抽象享元、具体享元和享元工厂,并通过图书馆借书系统展示了享元模式的应用,有效减少了内存中对象的数量,提高了系统性能。
摘要由CSDN通过智能技术生成

23种设计模式之享元模式

模式结构

  1. 抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。
  2. 具体享元(Concrete Flyweight)角色:实现抽象享元角色中所规定的接口。
  3. 享元工厂(Flyweight Factory)角色:负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。

案例

/**
 * 抽象享元类
 */
public interface Book {
    public void borrow();
}

/**
 * 具体享元类
 */
public class ConcreteBook implements Book{
    private String name;

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

    @Override
    public void borrow() {
        System.out.println("借出一本书:" + name);
    }
}
/**
 * 享元工厂
 */
public class Library {
    private Map<String, Book> bookPools = new HashMap<>();
    private static Library factory = new Library();

    public static Library getInstance(){
        return factory;
    }

    public Book libToBorrow(String name){
        Book book = null;
        if(bookPools.containsKey(name)){
            book = bookPools.get(name);
        }else{
            book = new ConcreteBook(name);
            bookPools.put(name,book);
        }
        return book;
    }

    public int getAllBookSize(){
        return bookPools.size();
    }
}
/**
 * 模式客户端测试
 */
public class FlyweightTest {
    private static List<Book> books = new ArrayList<>();
    private static Library library;

    public static void main(String[] args) {
        library = Library.getInstance();
        studentBorrow("万历15年");
        studentBorrow("万历15年");
        studentBorrow("明朝那些事儿");
        studentBorrow("月亮与六便士");
        for(Book book: books){
            book.borrow();
        }
    }
    private static void studentBorrow(String name){
        books.add(library.libToBorrow(name));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值