《大话设计模式》java实现之享元模式

本文介绍了一种设计模式——享元模式的实际应用案例。通过创建一个简单的享元工厂,实现了根据不同类型的请求返回已存在的实例或者创建新的实例。示例代码展示了如何利用HashMap存储对象并根据需求获取或创建网站分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为方便记忆,我把享元模式理解为:(共)享元(素)模式,核心在于如果对象已存在,则直接返回提供使用,如果不存在则新建,核心代码正如菜鸟教程中所说,代码中有HashMap存放对象。
WebSite中只有一个方法,因此改为接口类,WebSiteFactory中的获得网站分类总数就不写了。
UML
这里写图片描述
代码结构
这里写图片描述

public class Client {
    public static void main(String[] args) {
        WebSiteFactory factory = new WebSiteFactory();

        WebSite fx = factory.getWebSiteCategory("产品展示");
        fx.use(new User("小菜"));

        WebSite fy = factory.getWebSiteCategory("产品展示");
        fy.use(new User("大鸟"));

        WebSite fz = factory.getWebSiteCategory("产品展示");
        fz.use(new User("娇娇"));

        WebSite fl = factory.getWebSiteCategory("博客");
        fl.use(new User("老顽童"));

        WebSite fm = factory.getWebSiteCategory("博客");
        fm.use(new User("桃谷六仙"));

        WebSite fn = factory.getWebSiteCategory("博客");
        fn.use(new User("南海鳄神"));
    }
}
public class ConcreteWebSite implements WebSite {

    private String name;

    public ConcreteWebSite(String name) {
        super();
        this.name = name;
    }

    @Override
    public void use(User user) {
        System.out.println("网站分类:" + name + "用户:" + user.getName());
    }

}
public class User {
    private String name;

    public String getName() {
        return name;
    }

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

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

}
public interface WebSite {
    public void use(User user);
}
public class WebSiteFactory {
    private Map<String, WebSite> flyweights = new HashMap<>();

    //获得网站分类,也是享元模式的核心代码,有就直接提供,没有就新建
    public WebSite getWebSiteCategory(String key) {
        if(!flyweights.containsKey(key)) {
            flyweights.put(key, new ConcreteWebSite(key));
        }
        return flyweights.get(key);
    }
}

运行结果
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值