zoukankan      html  css  js  c++  java
  • 学习笔记——享元模式

    模拟红黑旗子实现:

     1 /**
     2 *享元模式: 类似Interger包装类,在-128~127之间的小数,由不同的对象共享
     3 * 就是把大量的,经常要用的对象中的不变内容封装到一个类中,而把那些不同的属性放到外面,需要用的时候再传给前者,
     4 * 这样可以节省很多内存空间,正如一片英文文档,其中内容均为a~z等字母,我们不必也不能把各个字符创建成一个对象,试想一下,如果
     5 * 这篇文档长达几万甚至几十万,那创建的对象不把内存给占死?文档中的字符都是一样的,所不同的是它们的位置,
     6 * 所以,我们只需为每个字符创建一个对象,而将不同的坐标位置传给相应对象让其进行显示即可,这样可以大大节省内存空间,
     7 * 实现享元要通过FlyWeightFactory来实现,如果所用对象已经存在,就直接用key得到该对象并返回
     8  */
     9 public interface ChessFlyWeight {
    10     void setColor(String color);
    11     String getColor();
    12     void display(Point point);
    13 }
    14 
    15 class ConcreteChess implements ChessFlyWeight{
    16     public ConcreteChess(String color){
    17         this.color = color;
    18     }
    19 
    20     @Override
    21     public void setColor(String color) {
    22         this.color = color;
    23     }
    24 
    25     @Override
    26     public String getColor() {
    27         return color;
    28     }
    29 
    30     @Override
    31     public void display(Point point) {
    32         System.out.println("颜色: " + color + ", 位置:(" + point.getX() + "," + point.getY() + ")");
    33     }
    34 
    35     private String color;
    36 }
    View Code
     1 import java.util.concurrent.ConcurrentHashMap;
     2 
     3 public class FlyWeightFactory {
     4     public static ChessFlyWeight getChess(String color){
     5         if(chm.containsKey(color)){
     6             return chm.get(color);
     7         } else{
     8             ChessFlyWeight cfw = new ConcreteChess(color);
     9             chm.put(color, cfw);
    10             return cfw;
    11         }
    12     }
    13     
    14     //通过map确保使用同一个对象
    15     private static ConcurrentHashMap<String, ChessFlyWeight> chm = new ConcurrentHashMap<>();
    16 }
    View Code
     1 public class Point {
     2     public Point(){
     3 
     4     }
     5 
     6     public Point(int x, int y) {
     7         this.x = x;
     8         this.y = y;
     9     }
    10 
    11     public int getX() {
    12         return x;
    13     }
    14 
    15     public void setX(int x) {
    16         this.x = x;
    17     }
    18 
    19     public int getY() {
    20         return y;
    21     }
    22 
    23     public void setY(int y) {
    24         this.y = y;
    25     }
    26 
    27     private int x;
    28     private int y;
    29 }
    View Code

    测试类:

     1 public class Test {
     2     public static void main(String[] args) {
     3         ChessFlyWeight c = FlyWeightFactory.getChess("red");
     4         ChessFlyWeight c2 = FlyWeightFactory.getChess("red");
     5         System.out.println(c);
     6         System.out.println(c2);
     7         ChessFlyWeight c3 = FlyWeightFactory.getChess("black");
     8         System.out.println(c3);
     9     }
    10 }
    View Code
  • 相关阅读:
    bash 笔记
    lvs: linux virtual server
    学习html第一天
    学习c语言的第14天
    c语言学习的第13天2
    c语言学习的第13天1
    c语言学习的第12天
    c语言学习的第11天 指针
    移动端点击延迟300毫秒----FastClick用法
    H5移动端复制功能实现
  • 原文地址:https://www.cnblogs.com/Hr666/p/10384733.html
Copyright © 2011-2022 走看看