设计模式学习笔记(13)——享元模式

本人做的设计模式学习笔记系列的博文旨在用于个人学习之用,主要记载自己对设计模式的理解及代码的实现

享元模式(Flyweight Pattern)

  在跳棋游戏中,玩家可以有2-6人,每位玩家各自用一种颜色的棋子。假设现在只有两名玩家,分别使用红色和蓝色的棋子。以蓝方棋子来说,蓝方的每个棋子除了坐标不同,颜色都是相同的。那么,颜色为蓝色就是蓝方棋子的内部共同的属性,蓝方棋子不同的状态在于在棋盘上的位置,可以看作是蓝方每个棋子的外部属性。
  由此看来,如果我们想要实现一个跳棋游戏软件,为每个棋子分配相同的资源会造成资源浪费。为了减少资源的开销,由此引出享元模式。在我看来,当一个对象中有一部分属性不论创建多少个该对象的实例都不会改变,而另一部分则会视情况改变时,可以使用享元模式来实现此对象。
  在享元模式中,包含的角色有,抽象享元类(Flyweight)、具体享元类(ConcreteFlyweight)、享元工厂类(FlyweigthFactory)。在享元工厂中,会维持有一个享元池,用于存放享元对象。一下以上文中的红蓝双方跳棋对弈为例给出demo。

import java.util.HashMap;

/*
 * 棋子,抽象享元类
 * */
abstract class Chess{
    protected String color;
    public abstract void placeChess(int x,int y);
}

/*
 * 跳棋,具体享元类
 * */
class ConcreteChess extends Chess{
    public ConcreteChess() {
        super();
    }

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


    @Override
    public void placeChess(int x, int y) {
        System.out.println("棋子:"+this.color+" 位置:("+x+","+y+")");
    }
}

/*
 * 享元工厂类
 * */
class ChessFactory{
    //享元池
    private static HashMap hashMap=new HashMap();

    public static Chess getChess(String color){
        if(hashMap.containsKey(color)){
            System.out.println("Get Chess From Flyweight Pool");
            return hashMap.get(color);
        }else{
            ConcreteChess newChess=new ConcreteChess(color);
            hashMap.put(color, newChess);
            return newChess;
        }
    }
}



public class FlyweigthPattern {
    public static void main(String[] args){
         ConcreteChess redChess=(ConcreteChess)ChessFactory.getChess("red");
         ConcreteChess blueChess=(ConcreteChess)ChessFactory.getChess("blue");

         redChess.placeChess(1, 1);
         blueChess.placeChess(2, 2);

         redChess=(ConcreteChess)ChessFactory.getChess("red");
         blueChess=(ConcreteChess)ChessFactory.getChess("blue");
    }
}

运行结果
棋子:red 位置:(1,1)
棋子:blue 位置:(2,2)
Get Chess From Flyweight Pool
Get Chess From Flyweight Pool

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