提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本人对于设计模式的学习,仅供参考!
一、享元模式
1.定义
享元模式,它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件,他适合用于只是因为重复而导致使用无法令人接受的大量内存的大量物件。编程中:String常量池、数据库连接池等等都是享元模式的应用,所以说享元模式是池技术的重要实现方式。
2.状态
内蕴状态储存在享元内部,不会随环境的改变而不同,是可以共享的。
外运状态是不可以共享的,他随环境的改变而改变,因此外蕴状态是由客户端来保持。
3.结构图
二、代码实现
1. Flyweight抽象类
public abstract class Flyweight {
//内蘊状态
public String desc;
//外部状态
protected final String name;
//要求享元角色必须接受外部状态
public Flyweight(String name) {
this.name = name;
}
//业务操作
public abstract void doSome(int desc);
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
2. Flyweight类
//具体享元类,被共享的對象類
public class FlyweightA extends Flyweight {
public FlyweightA(String name) {
super(name);
}
//具體業務
@Override
public void doSome(int desc) {
System.out.println("FlyweightA"+desc);
}
}
3. FlyweightPool类
//用來存放共享數據的容器
public class FlyweightPool {
//FlyWeight類對象集合
private Map<String,Flyweight> flyweights=new HashMap<>();
public Flyweight getFlyweight(String name){
if (flyweights.containsKey(name)){
System.out.print("直接從池中取出"+name+"=====>");
return flyweights.get(name);
}else {
Flyweight flyweight=new FlyweightA(name);
flyweights.put(name,flyweight);
System.out.print("創建一個"+name+"=====>");
return flyweight;
}
}
}
4. 程序測試:
public class Main {
public static void main(String[] args) {
int sort=0;
FlyweightPool pool=new FlyweightPool();
pool.getFlyweight("A").doSome(++sort);
pool.getFlyweight("B").doSome(++sort);
pool.getFlyweight("A").doSome(++sort);
pool.getFlyweight("A").doSome(++sort);
pool.getFlyweight("B").doSome(++sort);
pool.getFlyweight("B").doSome(++sort);
}
}
程序結果:
創建一個A=====>FlyweightA1
創建一個B=====>FlyweightA2
直接從池中取出A=====>FlyweightA3
直接從池中取出A=====>FlyweightA4
直接從池中取出B=====>FlyweightA5
直接從池中取出B=====>FlyweightA6
Process finished with exit code 0
总结
系统中有大量对象时,这些对象消耗大量内存时,这些对象的状态大部分可以外部化时即可使用享元模式。享元模式可大大减少对象的创建,降低程序内存的占用,提高效率。但同也提高了系统的复杂度,需要分离出内部状态和外部状态,而外部状态具有固化特性,不应该随着内部状态的改变而改变。