NOTE

6.16 享元模式

1. 定义 适用于大量相同或者相似对象的创建,如线程池 2. uml 3. 使用 3.1. client 3.2. 享元 3.3. 工厂

Software Architecture & Engineering约 1 分钟读完historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 定义

适用于大量相同或者相似对象的创建,如线程池

2. uml

PlantUML 图表

3. 使用

3.1. client

public class Client
{
    public static void main(String[] args)
    {
        Chess chess1 = ChessFactory.getChess("黑色");
        Chess chess2 = ChessFactory.getChess("黑色");

        //相同
        System.out.println(chess1 == chess2);

        chess1.display(new Coordinate(10,20 ));

    }
}

3.2. 享元

public class Chess
{
    //共享的属性
    protected String color;

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

    public String getColor()
    {
        return color;
    }

    public void setColor(String color)
    {
        this.color = color;
    }

    public void display(Coordinate coordinate)
    {

    }
}
public class ConcreateChess extends Chess
{
    public ConcreateChess(String color)
    {
        super(color);
    }

    @Override
    public void display(Coordinate coordinate)
    {
        System.out.println(this.color);
        System.out.println(coordinate);
    }

}
public class Coordinate
{
    //非共享的属性
    private int x,y;

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

    @Override
    public String toString()
    {
        return "Coordinate{" + "x=" + x + ", 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;
    }
}

3.3. 工厂

public class ChessFactory
{
    //对象池
    private static Map<String, Chess> chessMap = new HashMap<>();

    public static Chess getChess(String color)
    {
        //有的话直接从池子里取,没有的话创建再放入池子
        chessMap.putIfAbsent(color, new ConcreateChess(color));
        return chessMap.get(color);
    }
}

讨论

使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看