zoukankan      html  css  js  c++  java
  • 享元模式

    1、简介

    享元模式(Flyweight Pattern),主要用于减少对象的穿件,减少内存的占用以提高程序性能。

    尝试重用现有对象,如果未找到匹配的对象,再去新建对象。

    核心代码:
    让Hashmap缓存这些对象

    优点:
    大大减少了对象的创建,降低系统内存,提高运行效率

    缺点:
    提高了系统的复杂度,需要分离为内部状态和外部状态,而且外部状态具有固有化的性质,不应该根据内部状态的变化而变化,否则会造成系统混乱。

    注意事项:

    1. 必须区分外部状态和内部状态
    2. 必须增加一个工厂对象加以控制

    2、使用

    // 形状接口
    public interface Shape {
    	
    	void draw();
    }
    
    // 形状类
    public class Cricle implements Shape{
    	
    	private String color;
    	private int x;
    	private int y;
    	private int radius;
    	
    	@Override
    	public void draw() {
    		System.out.println("draw Cricle [color=" + color + ", x=" + x + ", y=" + y + ", radius=" + radius + "]");
    	}
    	
    	@Override
    	public String toString() {
    		return "Cricle [color=" + color + ", x=" + x + ", y=" + y + ", radius=" + radius + "]";
    	}
    	
    	public String getColor() {
    		return color;
    	}
    	public void setColor(String color) {
    		this.color = color;
    	}
    	public void setX(int x) {
    		this.x = x;
    	}
    	public void setY(int y) {
    		this.y = y;
    	}
    	public void setRadius(int radius) {
    		this.radius = radius;
    	}
    }
    
    // 形状工厂
    public class CircleFactory {
    	
    	private static final HashMap<String, Shape> circles = new HashMap<>();
    
    	
    	public static Shape getCircle(String color) {
    		Cricle cricle = (Cricle) circles.get(color);
    		
    		if(cricle == null) {
    			cricle = new Cricle();
    			cricle.setColor(color);
    			System.err.println("Create new color"+ color);
    			circles.put(color, cricle);
    		}
    		return cricle;
    	}
    }
    
    // Test
    private static final String[] colors = {"Red", "Yello", "Green", "White", "Black"};
    
    for(int i=0;i<16;i++) {
    	String color = colors[(int)(Math.random()*colors.length)];
    	Cricle circlo = (Cricle) CircleFactory.getCircle(color);
    	circlo.setRadius(100);
    	circlo.setX((int)Math.random()*100);
    	circlo.setY((int)Math.random()*100);
    	circlo.draw();
    }
    
  • 相关阅读:
    4. Object
    3. string
    8. 滚动条美化
    7. 单位,移动布局
    2. js的异步
    2. 即时通讯
    让PHP更快的提供文件下载
    phpstorm+xdebug远程调试设置
    postman自动生成签名
    一位技术人员成长历程
  • 原文地址:https://www.cnblogs.com/kungFuPander/p/13474607.html
Copyright © 2011-2022 走看看