设计模式-享元模式

目录

1.初步认识

2.状态模式

3.角色功能

4.代码实战 

5.优缺点

1.初步认识

  • 享元设计模式(Flyweight Pattern):属于结构型模式,主要用于减少创建对象的数量,以减少内存占用和提高性能,它提供了减少对象数量从而改善应用所需的对象结构的方式。
  • 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象

2.状态模式

  • 内部状态:
    • 不会随环境的改变而有所不同,是可以共享的
  • 外部状态:
    • 不可以共享的,它随环境的改变而改变的,因此外部状态是由客户端来保持(因为环境的变化一般是由客户端引起的)

3.角色功能

  • 抽象享元角色:为具体享元角色规定了必须实现的方法,而外部状态就是以参数的形式通过此方法传入
  • 具体享元角色:实现抽象角色规定的方法。如果存在内部状态,就负责为内部状态提供存储空间。 
  • 享元工厂角色:负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键
  • 客户端角色:维护对所有享元对象的引用,而且还需要存储对应的外部状态

4.代码实战 

抽象类-网站方法

/**
 * 抽象网站
 *
 * 抽象享元角色
 */
public abstract class CloudWeSite {

    //抽象发放
    public abstract void run(Company company);

}

实体类 -公司

/**
 * 公司实体
 */
public class Company {

    private String name;

    public Company() {
    }

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

    public String getName() {
        return name;
    }

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

具体的网站类型 -不同的网站

/**
 * 具体的网站
 * 共享内部数据
 * 具体享元角色
 */
public class ConcreteWeSite extends CloudWeSite {

    //网站类型
    private String category;

    public ConcreteWeSite(String category) {
        this.category = category;
    }

    //重写方法
    @Override
    public void run(Company company) {
        System.out.println("网站分类:" + category + ",公司:" + company.getName());
    }
}

抽象工厂-是否复用网站

/**
 * 享元工厂
 */
public class WebSiteFactory {

    private Map<String, CloudWeSite> map = new Hashtable<>();


    /**
     * 根据类型获取具体的享元角色
     *
     * @param category
     * @return
     */
    public CloudWeSite getWebSiteByKey(String category) {
        //根据类型,看map中是否存在
        if (map.containsKey(category)) {
            //存在直接返回
            return map.get(category);
        } else {
            //不存在
            ConcreteWeSite concreteWeSite = new ConcreteWeSite(category);
            //创建完成后,先放入map中
            map.put(category, concreteWeSite);
            //在返回
            return concreteWeSite;
        }
    }

    /**
     * 统计数量
     *
     * @return
     */
    public int getWebSiteNum() {
        return map.size();
    }
}

 实测

public class MyMain {
    public static void main(String[] args) {
        WebSiteFactory webSiteFactory=new WebSiteFactory();
        CloudWeSite weSite1 = webSiteFactory.getWebSiteByKey("企业官网");
        weSite1.run(new Company("能力有限公司"));

        CloudWeSite weSite2 = webSiteFactory.getWebSiteByKey("企业官网");
        weSite2.run(new Company("能力无限公司"));
        CloudWeSite weSite3 = webSiteFactory.getWebSiteByKey("校园活动");
        weSite3.run(new Company("小小课堂"));

        System.out.println("网站总数:"+webSiteFactory.getWebSiteNum());
    }
}

5.优缺点

  • 优点:
    • 大大减少了对象的创建,降低了程序内存的占用,提高效率
  • 缺点: 
    • 提高了系统的复杂度,需要分离出内部状态和外部状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会敲代码的小张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值