定义:面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。
优点:1.减少了对象的创立,减少了内存的使用
缺点:1.提高了系统的复杂度。
2.需要分离出内部状态和外部状态,而外部状态具有固化特性,不应该随着内部状态的改变而改变
使用场景:1.String常量池、数据库连接池、缓冲池等等都是享元模式
原理:1缓存对象,统一管理,不必挨个创建,用 HashMap 存储这些对象。(建立对象池),
类图:
实例代码:
抽象享元角色
interface IFlyweight {
void operation(String extrinsicState);
}
具体享元角色
static class ConcreteFlyweight implements IFlyweight {
private String intrinsicState;
public ConcreteFlyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
@Override
public void operation(String extrinsicState) {
//方法。。。。
}
}
享元工厂
static class FlyweightFactory {
private static Map<String, IFlyweight> pool = new HashMap<>();
// 因为内部状态具备不变性,因此作为缓存的键
public static IFlyweight getFlyweight(String intrinsicState) {
if (!pool.containsKey(intrinsicState)) {
IFlyweight flyweight = new ConcreteFlyweight(intrinsicState);
pool.put(intrinsicState, flyweight);
}
return pool.get(intrinsicState);
}
}
调用
class Client {
public static void main(String[] args) {
IFlyweight flyweight1 = FlyweightFactory.getFlyweight("aa");
IFlyweight flyweight2 = FlyweightFactory.getFlyweight("bb");
flyweight1.operation("a");
flyweight2.operation("b");
}
栗子
抽象享元角色
//选肥皂
interface IChooseSoap{
void toChoose(String soapColor);
}
具体享元角色
public class ChooseSoap extends IChooseSoap{
private String name = "";
public ChooseSoap (String color) {
this.name = name;
}
@Override
public void toChoose() {
System.out.println("肥皂颜色是:" + color);
}
}
工厂类(处理内部对象)
public class Factory {
private HashMap<String, IChooseSoap> pool = new HashMap<>();
//获得肥皂
public IChooseSoap chooseSoap(String color) {
//如果没有这个颜色的 就买一个放在池中
if(!pool.containsKey(color)) {
pool.put(color, new ChooseSoap(keycolor);
}
//如果池中有 那么就在池中取
return (IChooseSoap)pool.get(color);
}
}
调用
public class Client {
public static void main(String[] args) {
Factory Factory = new Factory();
Factory.chooseSoap('粉色');
}
}