【结构型模式】享元模式

文章目录

      • 前言(一些废话,可以忽略)
        • 解决实际问题
        • 享元模式
      • 总结

前言(一些废话,可以忽略)

  • 享元模式,对象的共享设计思想,及采用容器将可能需要的对象封装起来
  • PS.部分类实现见文末

解决实际问题

  • 棋牌类游戏,五子棋,围棋等,棋子其实就两种,黑和白,但是他们的位置变化多端,这个是否如果没有位置上的棋子都创建一个对象的话,就很浪费空间,这个时候,如果就创建黑白两个对象,让后位置不停的变化,岂不是很节约空间
  • 这就是享元模式的设计思想,共享对象

享元模式

  • 抽象的棋子,可以设置其位置,可落子
/**
 * 棋子
 * @program: ade-someproblem
 * @author: cade franklin
 * @create: 2020-01-06 06:08
 **/
public interface Chess {
    /**
     * 落子
     */
    void down();

    void setPosition(Position position);
}
  • 具体的棋子,这里为五子棋,可以设置颜色,默认位置为0,0,可以为其设置新的位置
/**
 * 五子棋棋子
 * @program: ade-someproblem
 * @author: cade franklin
 * @create: 2020-01-05 05:20
 **/
public class FiveChess implements Chess{
    private String color;

    private Position position = new Position(0, 0);

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

    @Override
    public void down() {
        System.out.println("FiveChess.down:"+position.toString());
    }

    @Override
    public void setPosition(Position position) {
        this.position = position;
    }
}
  • 需要一个工厂对象来存放获取棋子,相当于棋子池
/**
 * @program: ade-someproblem
 * @author: cade franklin
 * @create: 2020-01-05 05:21
 **/
public class FlyWeightFactory {

    private static final Map<String, Chess> chessList = new HashMap<String, Chess>();

    public static String BLACK = "BLACK";
    public static String WHITE = "WHITE";

    Chess getMyChess(String color){
        if(BLACK.equals(color) && WHITE.equals(color)){
            throw new RuntimeException("只有BLACK和WHITE");
        }

        //感觉这个地方是个单例,如果多线程的使用的话,得上锁
        Chess chess = chessList.get(color);
        if(chess == null){
            chess = new FiveChess(color);
            chessList.put(color, chess);
        }
        return chess;
    }
}
  • 使用案例,通过工厂对象创建棋子,如果存在棋子,则获得,如果没有将创建
/**
 * @program: ade-someproblem
 * @author: cade franklin
 * @create: 2020-01-05 05:21
 **/
public class FlyWeightMode {

    public static void main(String[] args) {
        FlyWeightFactory flyWeightFactory = new FlyWeightFactory();
        Chess fiveChess = flyWeightFactory.getMyChess(FlyWeightFactory.BLACK);
        Position position = new Position(1,2);
        fiveChess.setPosition(position);

        fiveChess.down();

        Chess fiveChess02 = flyWeightFactory.getMyChess(FlyWeightFactory.BLACK);
        Position position02 = new Position(2,32);
        fiveChess02.setPosition(position02);
        fiveChess02.down();
		//这里两个对象是相等的,因为他们都是相同的颜色
        System.out.println(fiveChess==fiveChess02);
    }
}

总结

  • 享元模式就是大家平常经常接触到的池技术,线程池呀,连接池呀,都是采用的这个思想
  • 当然也运用到了单例模式,因为我想要的是相同颜色的棋子只有一个

愿你不舍爱与自由。

你可能感兴趣的:(#,设计模式)