首页 > 其他 > 详细

设计模式之享元模式

时间:2020-04-06 00:31:08      阅读:72      评论:0      收藏:0      [点我收藏+]

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:运行程序,观察结果

技术分享图片

 

设计模式之享元模式

原文:https://www.cnblogs.com/vincentYw/p/12640041.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!