定制家具网站源代码,薛城做网站,保定网站建设制作开发平台,企业云平台写在前面
本文看下一种结构型设计模式#xff0c;享元模式。
1#xff1a;介绍
1.1#xff1a;什么时候使用享元模式
当程序需要大量的重复对象#xff0c;并且这些大量的重复对象只有部分属性不相同#xff0c;其他都是相同的时候#xff0c;就可以考虑使用享元设计…写在前面
本文看下一种结构型设计模式享元模式。
1介绍
1.1什么时候使用享元模式
当程序需要大量的重复对象并且这些大量的重复对象只有部分属性不相同其他都是相同的时候就可以考虑使用享元设计模式设计模式来实现。典型的如围棋游戏中的棋子除了颜色和位置不同外其他都相同。射击游戏中的子弹除了大小型号杀伤力等不同外其他都相同。
1.2UML类图
享元设计模式包含如下元素
1Flyweight定义享元对象的公共操作
2ConcreteFlyweight具体的享元对象
3FlyweightFactory享元对象工厂负责生产享元对象方便客户端获取享元对象的同时也可以缓存享元对象防止因为创建过多的对象而导致内存溢出等问题想一下射击游戏用户如果是用机关枪一直突突突得创建多少对象啊UML图如下 另外享元设计模式分为内部状态和外部状态如围棋游戏棋子的黑色和白色就是内部状态在对象的内部定义和维护是可以共享的但是落子的位置则是各不相同的就是外部状态需要外部传入。如果是工作中认为场景适合使用享元设计模式则一定要考虑清楚内部状态和外部状态的问题。
2实例
源码 。
2.1场景
围棋游戏创建游戏中的黑子和白子。
2.2程序
享元接口
public interface Chess {// 绘制棋子落子走一步棋// 位置外部状态由外部传入void draw(int x,int y);
}内部状态枚举
public enum Color {BLACK(黑色), WHITE(白色);private String name;// 默认就是private的并且不能反射暴力也不行Color(String name) {this.name name;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getAlias() {return this.name;}
}具体享元类 黑子和白子类
//黑棋
public class BlackChess implements Chess {// 内部状态共享private final Color color Color.BLACK;private final String sharp 圆形;public Color getColor() {return color;}// 外部状态Overridepublic void draw(int x, int y) {System.out.println(String.format(%s%s棋子置于%d%d处, sharp, color.getAlias(), x, y));}
}//白棋
public class WhiteChess implements Chess {//内部状态共享private final Color color Color.WHITE;private final String sharp 圆形;public Color getColor() {return color;}Overridepublic void draw(int x, int y) {System.out.println(String.format(%s%s棋子置于%d%d处, sharp, color.getAlias(), x, y));}
}享元工厂类
public class ChessFactory {private static final MapColor, Chess chessMap new HashMap();public static Chess getChess(Color color) {Chess chess chessMap.get(color);if (chess null) {chess color Color.WHITE ? new WhiteChess() : new BlackChess();chessMap.put(color, chess);}return chess;}
}测试
public class FlyweightClient {Testpublic void playChess() {//下黑子Chess backChess1 ChessFactory.getChess(Color.BLACK);backChess1.draw(2, 5);//下白子Chess whiteChess ChessFactory.getChess(Color.WHITE);whiteChess.draw(3, 5);//下黑子Chess backChess2 ChessFactory.getChess(Color.BLACK);backChess2.draw(2, 6);System.out.println(String.format(backChess1:%d | backChess2:%d | whiteChess:%d,backChess1.hashCode(), backChess2.hashCode(), whiteChess.hashCode()));}
}运行
圆形黑色棋子置于25处
圆形白色棋子置于35处
圆形黑色棋子置于26处
backChess1:1327763628 | backChess2:1327763628 | whiteChess:1915503092Process finished with exit code 0写在后面
参考文章列表
秒懂设计模式之享元模式Flyweight Pattern 。