设计模式 - 享元模式

初衷 :因架构(开发)场景(需求)而使用设计模式,莫为了使用设计模式而设计架构场景!

设计模式共23种,分为三种类型

  • 创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式
  • 结构型模式:代理模式、装饰模式、外观模式、享元模式、桥接模式、组合模式、适配器模式
  • 行为型模式:观察者模式、策略模式、中介者模式、模版方法模式、命令模式、迭代器模式、职责链模式(责任链模式)、备忘录模式、解释器模式(Interpreter模式)、状态模式、访问者模式

基本概念

享元模式是设计模式中少数几个以提高系统性能为目的的模式之一,主要实现了对象的共享,即共享池(对象池),我们可以理解为如果在一个系统中存在多个相同的对象,为了减少内存的大量消耗,那么只需要共享一份对象的拷贝,而不必为每一次使用都创建新的对象 ~

角色分配

在享元模式中,除了需要构造类之外,常常会出现一个工厂类用于维护和创建对象

抽象享元 - Flyweight

定义需要共享的对象功能接口

具体享元类 - ConcreteFlyweight

实现抽象享元类的接口,实现对象的某一具体逻辑

享元工厂 - FlyweightFactory

用于创建具体享元类,维护相同的享元对象

当请求对象已经存在时,直接返回对象,不存在时,在创建对象

优缺点

优点

以我目前的理解程度,觉得享元模式在性能优化方面做的贡献是最大的,其中又主要体现在内存方面!

在现实开发场景中,随着项目的庞大,会有很多类似Model、Bean、Info的存在,从架构、优化方面考虑我们都需要减少内存的开销,故使用享元模式大大的减少了内存浪费,提升了很大的性能 ~

缺点

其实对于享元类有内部状态和外部状态,其区分就是图书馆的书一部分可以外借(外部状态),一部分不可外借(内部状态),两个状态的划分对于书籍管理来说优点复杂化了

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

场景

  • 享元模式是一个类有很多对象
  • 单例是一个类仅一个对象

目的

  • 享元模式是为了节约内存空间,提升程序性能
  • 单例模式则主要是出于共享状态的目的

理解

享元模式在我的理解中包含常常包含单例模式、工厂模式 ~


实验演练
辅助理解

假设我们的业务中需要获取用户当前的职业,同时我们清楚社会中各职业又很多,很可能出现A是设计师、B是产品经理、C是程序员,然后D也可能是设计师、产品经理、程序员的某一种,当我们这样去重复创建D这种职业类型的话,明显没有任何必要,因为明眼人是一种内存的浪费,当然数据量小的话还好,但是当数据体量太大的时候,问题就会凸显出来 ~

  • 假设我们的业务中需要获取用户当前的职业
  • 同时我们清楚社会中各职业又很多,很可能出现A是设计师、B是产品经理、C是程序员,然后D也可能是设计师、产品经理、程序员的某一种
  • 针对这种情况,一般有俩种方式,一种就是重复新建,带来的是内存开销增大 ;另一种就是首次新建,1+次读缓存 ,读缓存的操作好比单例,却又因针对对象而有所不同
具体实现

因从事Android端,故使用AndroidStudio工具,java应无影响;其他语言者请主抓思想~

抽象享元

package nkwl.com.flyweightpattern;

/**
 * @author MrLiu
 * @date 2020/1/12
 * desc
 */
public interface Flyweight {
    
    //共性:职业
    void job();
}

具体享元类

package nkwl.com.flyweightpattern;

import android.util.Log;

/**
 * @author MrLiu
 * @date 2020/1/12
 * desc
 */
public class ConcreteFlyweight_Job implements Flyweight {

    private String jobData;

    public ConcreteFlyweight_Job(String jobData) {
        this.jobData = jobData;
    }

    public String getJobData() {
        return jobData;
    }

    public void setJobData(String jobData) {
        this.jobData = jobData;
    }

    @Override
    public void job() {
        Log.e("tag", "我的职业是" + jobData);
    }
}

享元工厂

package nkwl.com.flyweightpattern;

import java.util.HashMap;

/**
 * @author MrLiu
 * @date 2020/1/9
 * desc
 */
public class FlyweightFactory {

    public static HashMap<String, ConcreteFlyweight_Job> pools = new HashMap<String, ConcreteFlyweight_Job>();

    private static FlyweightFactory factory = null;

    public static FlyweightFactory getInstance() {
        if (factory != null) {
            return factory;
        } else {
            return new FlyweightFactory();
        }
    }

    public static ConcreteFlyweight_Job storageJobType(String job) {
        ConcreteFlyweight_Job flyweightJob = null;
        if (pools.containsKey(job)) {
            flyweightJob = pools.get(job);
        } else {
            flyweightJob = new ConcreteFlyweight_Job(job);
            pools.put(job, flyweightJob);
        }
        return flyweightJob;
    }
    
}

调用场景

package nkwl.com.flyweightpattern;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FlyweightFactory factory = FlyweightFactory.getInstance();

        String a = "设计师";
        String b = "产品经理";
        String c = "程序员";
        String d = "程序员";
        ConcreteFlyweight_Job jobA = FlyweightFactory.storageJobType(a);
        jobA.setJobData(a);
        ConcreteFlyweight_Job jobB = FlyweightFactory.storageJobType(b);
        jobB.setJobData(b);
        ConcreteFlyweight_Job jobC = FlyweightFactory.storageJobType(c);
        jobC.setJobData(c);
        ConcreteFlyweight_Job jobD = FlyweightFactory.storageJobType(d);
        jobD.setJobData(d);
        jobA.job();
        jobB.job();
        jobC.job();
        jobD.job();

        Log.e("tag", "对象存储空间地址:");
        Log.e("tag", jobA + "");
        Log.e("tag", jobB + "");
        Log.e("tag", jobC + "");
        Log.e("tag", jobD + "");
    }
}

实现效果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

远方那座山

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

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

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

打赏作者

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

抵扣说明:

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

余额充值