利用共享的方式來實現對象複用,這樣可以大幅度減少對象創建的數量、避免了創建大量相似對象的開銷,從而提高了資源的利用率。
在之前的單例模式中,曾經寫過一個“多例模式”的demo,一個類可以有固定個數的對象實例,每次需要使用這個類的實例的時候就從存有對象實例的集合中取一個使用。
public class MultiSingleton {
private static Map<Integer,MultiSingleton> multiSingletonMap = new HashMap<>();
static {
multiSingletonMap.put(0,new MultiSingleton());
multiSingletonMap.put(1,new MultiSingleton());
multiSingletonMap.put(2,new MultiSingleton());
}
private MultiSingleton(){
}
public static MultiSingleton getInstance() {
return multiSingletonMap.get(new Random().nextInt(3));
}
}
享元模式中有以下角色
- 享元類:定義了享元對象需要實現的公共操作方法。在該方法中會使用一個狀態作為輸入參數,也叫做外部狀態。
- 享元工廠類:管理一個享元對象類的緩存池,它會存儲享元對象之間需要傳遞的共有狀態。
- 具體享元類:享元類的實現類。
實現
public interface Flyweight {
void operation();
}
public class ConcreteFlyweightA implements Flyweight{
@Override
public void operation() {
System.out.println("ClassName:"+this.getClass().getSimpleName());
}
}
public class ConcreteFlyweightB implements Flyweight{
@Override
public void operation() {
System.out.println("ClassName:"+this.getClass().getSimpleName());
}
}
public class FlyweightFactory {
private Map<String,Flyweight> map = new HashMap();
public FlyweightFactory() {
map.put("A",new ConcreteFlyweightA());
map.put("B",new ConcreteFlyweightB());
}
public Flyweight getFlyweight(String p){
return map.get(p);
}
}
測試
public class FlyweightTest {
@Test
public void test(){
FlyweightFactory factory = new FlyweightFactory();
Flyweight flyweightA = factory.getFlyweight("A");
Flyweight flyweightB = factory.getFlyweight("B");
flyweightA.operation();
flyweightB.operation();
}
}
======結果=======
ClassName:ConcreteFlyweightA
ClassName:ConcreteFlyweightB