設計模式(4)享元模式

享元模式(Flyweight Pattern)主要用於減小建立的對象數量,並減小內存佔用並提升性能。 這種類型的設計模式屬於結構模式,由於該模式提供了減小對象計數的方法,從而改善應用的對象結構。設計模式

第一步:建立一個Shape接口,代碼以下dom

/**
 * @author 歐陽飄
 */
public interface Shape {
   void draw();
}

第二步:建立一個實現相同接口的具體類Circleide

package com.test.flyPatternMode;性能

/**
 * @author 歐陽飄
 */
public class Circle implements Shape {
   //顏色
   private String color;
   //圓心位置 x,y
   private int x;
   private int y;
   //圓的半徑
   private int radius;this

   public Circle(String color){
      this.color = color;        
   }spa

   public void setX(int x) {
      this.x = x;
   }.net

   public void setY(int y) {
      this.y = y;
   }設計

   public void setRadius(int radius) {
      this.radius = radius;
   }對象

   @Override
   public void draw() {
      System.out.println("畫圓:  [Color : " + color + ", x : " + x + ", y :" + y + ", radius :" + radius);
   }
}接口

第三步:建立一個工廠根據給定的信息生成具體類的對象

/**
 * @author 歐陽飄
 */

public class ShapeFactory {
   //用這個Map來存放形狀對象, key是顏色
   private static final HashMap<String, Shape> circleMap = new HashMap<String,Shape>();

   //若是不存在, 那麼就建立對象, 若是存在那麼直接從Map中去取
   public static Shape getCircle(String color) {
      Circle circle = (Circle)circleMap.get(color);
      if(circle == null) {
         circle = new Circle(color);
         circleMap.put(color, circle);
         System.out.println("建立圓對象------顏色爲: " + color);
      }
      return circle;
   }
}

第四步:使用工廠並經過傳遞諸如顏色的信息來得到具體類的對象

/**
 * @author 歐陽飄
 */

public class FlyweightPatternDemo {    private static final String colors[] = { "Red", "Green", "Blue", "White", "Black" };    public static void main(String[] args) {       for(int i=0; i < 20; ++i) {          Circle circle = (Circle)ShapeFactory.getCircle(getRandomColor());          circle.setX(getRandomX());          circle.setY(getRandomY());          circle.setRadius(100);          circle.draw();       }    }    private static String getRandomColor() {       return colors[(int)(Math.random()*colors.length)];    }    private static int getRandomX() {       return (int)(Math.random()*100 );    }        private static int getRandomY() {       return (int)(Math.random()*100);    } }

相關文章
相關標籤/搜索