设计模式 | 享元模式(Flyweight)

定义:

运用共享技术有效地支持大量细粒度的对象。

结构:(书中图,侵删)

 

一个享元工厂类
一个抽象享元类
若干需要共享的享元子类
若干不需要共享的享元子类
 
这里要说两个概念:
内部状态:共享类内部的叫内部状态
外部状态:不在共享类内部的叫外部状态

实例:

享元模式的意义就是使相同或相似的对象共享同一个对象,从而起到节省资源的作用。
书中用到的例子是帮人做网站,很多客户的需求其实是差不多的,但是为每个客户都新建虚拟机,复制一套一套代码,是很浪费资源的事情。
而且一旦有Bug或者需求要修改,工作量也是巨大的,完全可以共享对象。
我想起了自己上大学那会也帮人做过网站,后来人家又介绍了生意过来,我因为上班比较忙就拒绝了,要是早点把设计模式学好,说不定都财富自由了(狗头)
 
下面的实例用书中提到的另外一个围棋的例子吧。
围棋的棋子都是一样的,只是颜色和位置不同。
 
抽象棋子接口:
package designpattern.flyweight;

public interface Chessman {
    abstract void position(String position);
}

具体棋子类:

package designpattern.flyweight;

public class ConcreteChessman implements Chessman {
    String color;

    public ConcreteChessman(String color) {
        this.color = color;
    }

    @Override
    public void position(String position) {
        System.out.println(color + "棋下在:" + position);
    }

}

棋子工厂类:

package designpattern.flyweight;

import java.util.HashMap;
import java.util.Map;


public class ChessmanFactory {
    Map<String, Chessman> map = new HashMap<>();

    public Chessman getChessman(String color) {
        if (map.containsKey(color)) {
            return map.get(color);
        } else {
            Chessman chessman = new ConcreteChessman(color);
            map.put(color, chessman);
            return chessman;
        }
    }
}

客户端:

package designpattern.flyweight;

public class Client {
    public static void main(String[] args) {
        ChessmanFactory factory=new ChessmanFactory();
        Chessman cc1= factory.getChessman("黑");
        cc1.position("右上星位");
        
        Chessman cc2= factory.getChessman("白");
        cc2.position("天元");
        
        Chessman cc3= factory.getChessman("黑");
        cc3.position("右上目外");
    }
}

结果输出:

黑棋下在:右上星位
白棋下在:天元
黑棋下在:右上目外

总结:

不知道该总结些什么了,直接上书中的内容吧:

 

 

上面的后半句我没太看明白,所以留给大家自己理解吧。

 

posted @ 2020-11-14 19:25  莫愆  阅读(78)  评论(0编辑  收藏  举报