设计模式|设计模式 - 享元模式
初衷 :因架构(开发)场景(需求)而使用设计模式,莫为了使用设计模式而设计架构场景!设计模式共23种,分为三种类型
创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式
行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式
未来可期 ~
- 基本概念
- 角色分配
- 抽象享元 - Flyweight
- 具体享元类 - ConcreteFlyweight
- 享元工厂 - FlyweightFactory
- 优缺点
- 优点
- 缺点
- 享元模式、单例模式的区别
- 场景
- 目的
- 实验演练
- 辅助理解
- 具体实现
- 抽象享元
- 具体享元类
- 享元工厂
- 调用场景
- 实现效果
基本概念 享元模式是设计模式中少数几个以提高系统性能为目的的模式之一
主要实现了对象的共享,即共享池(对象池),我们可以理解为如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用都创建新的对象
角色分配 在享元模式中,除了需要构造类之外,常常会出现一个工厂类用于维护和创建对象
抽象享元 - 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 = https://www.it610.com/article/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, ConcreteFlyweight_Job> pools = new HashMap, 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 + "");
}
}
实现效果
文章图片
推荐阅读
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- 设计模式-代理模式-Proxy
- 【译】Rails|【译】Rails 5.0正式发布(Action Cable,API模式等)
- java静态代理模式
- VueX(Vuex|VueX(Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式)
- Kotlin基础(10)-代理模式在kotlin中的使用
- 长谈的确是这个时代需要的一种模式
- 《读_Head_First_有感》_“命令模式”
- 洗洗睡了|洗洗睡了 | 休息的时候,千万注意切换你的行为模式
- 设计模式【15】--从审批流中学习责任链模式