不得不会的23种Java设计模式(六)——享元模式

一、定义

享元模式是构造型模式之一,它通过共享数据使得相同对象在内存中仅创建一个实例,以降低系统创建对象实例的性能消耗

二、享元模式和单例模式的区别

  • 单例是该类创建自己的对象,整个应用中只有1个对象
  • 享元模式根据需要共享,一般被享元工厂类创建,有可能有多个不同的对象实例进行共享

三、案例

package test.flyweight02;

/**
 * 抽象享元角色
 */
public interface Flyweight {
    /**
     * 业务逻辑处理
     */
    void operation(String business);
}

package test.flyweight02;

/**
 * ConcreteFlyweight是具体享元角色
 */
public class ConcreteFlyweight implements Flyweight {

    private Character character;

    /**
     * 构造函数,构造方法传入该参数只要为业务考虑是否使用,若不使用该参数,也可不传入。
     * @param character
     */
    public ConcreteFlyweight(Character character) {
        this.character = character;
    }


    @Override
    public void operation(String business) {
        System.out.println("业务逻辑处理"+business);
    }
}

package test.flyweight02;

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

/**
 * 一个享元工厂,用来创建并管理Flyweight对象,主要是用来确保合理地共享Flyweight,
 * 当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或创建一个实例。
 */
public class FlyweightFactory {
    private Map<Character,Flyweight> files = new HashMap<>();

    public Flyweight factory(Character character){
        Flyweight fly = files.get(character);
        if(null == fly){
            fly = new ConcreteFlyweight(character);
            files.put(character,fly);
        }
        return fly;
    }
}

package test.flyweight02;


import java.util.HashSet;
import java.util.Set;

public class Test {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight fly1 = factory.factory('a');
        fly1.operation("First Call");

        Flyweight fly2 = factory.factory('b');
        fly2.operation("Second Call");

        Flyweight fly3 = factory.factory('a');
        fly3.operation("Third Call");
        Set<Flyweight> list = new HashSet<>();
        list.add(fly1);
        list.add(fly2);
        list.add(fly3);
        System.out.println("总共三次业务逻辑处理,调用的对象次数为"+list.size());


    }
}

在这里插入图片描述

四、总结

  • 享元模式理解起来比较简单,不用想的太过复杂
  • 享元模式里面包含了工厂模式
  • 使用场景1>系统中存在大量相似对象并消耗大量内存
    2>需要缓冲池的场景,对象复用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
装饰者模式是一结构型设计模式,它允许你动态地向对象添加行为。通过将对象放入装饰器类中,可以在运行时更改对象的行为。 在咖啡馆中,装饰者模式可以用于根据顾客的选择动态地添加配料并计算价格。我们可以创建一个基础咖啡类,然后创建多个装饰器类来添加不同的配料,并且每个装饰器类都可以计算自己的价格。 下面是一个简单的示例代码: ```java // 基础咖啡类 public abstract class Coffee { protected String description = "Unknown coffee"; public String getDescription() { return description; } public abstract double cost(); } // 浓缩咖啡类 public class Espresso extends Coffee { public Espresso() { description = "Espresso"; } public double cost() { return 1.99; } } // 装饰器类,用于添加牛奶 public class Milk extends Coffee { private Coffee coffee; public Milk(Coffee coffee) { this.coffee = coffee; } public String getDescription() { return coffee.getDescription() + ", Milk"; } public double cost() { return coffee.cost() + 0.5; } } // 装饰器类,用于添加摩卡 public class Mocha extends Coffee { private Coffee coffee; public Mocha(Coffee coffee) { this.coffee = coffee; } public String getDescription() { return coffee.getDescription() + ", Mocha"; } public double cost() { return coffee.cost() + 0.8; } } // 测试代码 public static void main(String[] args) { Coffee coffee = new Espresso(); // 创建一个浓缩咖啡 coffee = new Milk(coffee); // 添加牛奶 coffee = new Mocha(coffee); // 添加摩卡 System.out.println(coffee.getDescription() + " $" + coffee.cost()); } ``` 输出结果为:`Espresso, Milk, Mocha $3.29` 在这个例子中,我们创建了一个基础咖啡类 `Coffee`,并且创建了两个装饰器类 `Milk` 和 `Mocha`。我们可以通过创建不同的装饰器来添加不同的配料。最后,我们创建了一个浓缩咖啡对象 `Espresso`,并且动态地添加了牛奶和摩卡,最终计算出了价格。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yemuxiaweiliang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值