欢迎来到Vincentyw的博客

该来的终究会来,该走的也一定会离开。凡事都存在前因后果,因缘成熟了,果报便产生了,无法阻挡。
但是发生过了就会消失,有来就有走,一切都是过客,把握自己当下的因缘,承担起自己该承担的责任,做好眼前该做的事情,做的时候尽全力,过去便放下,放下即自在。

设计模式之享元模式

FlyWeight(享元模式)

一、享元模式简介

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象

核心:

  • 1、运用共享技术有效地支持大量细粒度的对象
  • 2、用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象
  • 3、享元对象能做到共享的关键是区分了内部状态和外部状态  === • 内部状态:可以共享,不会随环境变化而改变 • 外部状态:不可以共享,会随环境变化而改变

二、享元模式优缺点比较

优点:

  • 1、大大减少对象的创建,降低系统的内存,使效率提高

缺点:

  • 1、提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱

使用场景:

  • 1、系统有大量相似对象(String类)
  • 2、需要缓冲池的场景(线程池、数据库连接池)

注意事项:1、注意划分外部状态和内部状态,否则可能会引起线程安全问题。 2、这些类必须有一个工厂对象加以控制。

三、UML类图

四、设计实现

    步骤1:创建享元抽象接口类

//通常是一个接口或抽象类,声明公共方法,这些方法可以向外界提供对象 的内部状态,设置外部状态
public interface ChessFlyWeight {
    String getColor();
    void display(Coordinate c);
}

    步骤2:创建实现享元抽象接口具体实现类

public class ConcreteChess implements ChessFlyWeight {
    
    private String color;

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

    @Override
    public String getColor() {
        return color;
    }

    @Override
    public void display(Coordinate c) {
        System.out.println("棋子颜色为:"+color+"---棋子位置:x="+c.getX()+",y="+c.getY());
    }
}

步骤3:创建非共享享元类

/**
 * UnsharedConcreteFlyWeight 非共享享元类 
 *  不能被共享的子类可以设计为非共享享元类
 */
public class Coordinate {
    private int x,y;

    public Coordinate(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

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

    public int getY() {
        return y;
    }

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

步骤4:创建享元工厂方法类

//创建并管理享元对象,享元池一般设计成键值对
public class FlyWeightFactory {
    
    private static Map<String,ChessFlyWeight> map = new HashMap<>();
    
    public static ChessFlyWeight getFlyWeight(String str) {
        if(map.get(str)!=null) {
            return (ChessFlyWeight)map.get(str);
        }else {
            ChessFlyWeight cfw = new ConcreteChess(str);
            map.put(str, cfw);
            return cfw;
        }
    }
}

步骤5:调用者调用

public class FlyWeightDemo01 { 
    public static void main(String[] args) {
        ChessFlyWeight cfw = FlyWeightFactory.getFlyWeight("黑色");
        ChessFlyWeight cfw1 = FlyWeightFactory.getFlyWeight("黑色");
        System.out.println(cfw);
        System.out.println(cfw1);
        cfw.display(new Coordinate(10, 10));
        cfw1.display(new Coordinate(20, 20));
    }
}

步骤5:运行程序,观察结果

 

posted on 2020-04-05 23:50  VincentYew  阅读(246)  评论(0)    收藏  举报

导航