前言:
视频教程:黑马程序员Java设计模式详解,全网最全23种Java设计模式
什么是设计模式?
- 设计模式(Design Pattern)是前辈们对代码开发经验的总结,是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。
- 1995年,GoF(Gang of Four,四人组)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了23种设计模式,人称 【GoF设计模式】
设计模式分类 具体模式 创建型模式:
它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。⌛单例模式、⌛工厂模式、⌛抽象工厂模式、⌛建造者模式、⌛原型模式 结构型模式:
结构型模式描述如何将类或对象按某种布局组成更大的结构。⌛适配器模式、⌛桥接模式、⌛装饰模式、⌛代理模式、⌛外观模式、⌛组合模式、⌛享元模式、 行为型模式:
这些设计模式特别关注对象之间的通信。模板方法模、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式
享元模式
概述:
定义:
享元模式(Flyweight):
运用共享技术有效地支持大量细粒度的对象.[DP]
它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。
结构:
享元(Flyweight )模式中存在以下两种状态:
- 内部状态,即不会随着环境的改变而改变的可共享部分。
- 外部状态,指随环境改变而改变的不可以共享的部分。
享元模式的实现要领就是区分应用中的这两种状态,并将外部状态外部化。
类图:
图源:《大话设计模式》【程杰,著】
-
抽象享元角色(Flyweight):
通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据(内部状态),同时也可以通过这些方法来设置外部数据(外部状态)。
-
具体享元(Concrete Flyweight)角色 :
它实现了抽象享元类,称为享元对象;在具体享元类中为内部状态提供了存储空间。通常我们可以结合单例模式来设计具体享元类,为每一个具体享元类提供唯一的享元对象。
-
非享元(Unsharable Flyweight)角色 :
并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类;当需要一个非共享具体享元类的对象时可以直接通过实例化创建。
-
享元工厂(Flyweight Factory)角色 :
负责创建和管理享元角色。
当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。
实例:
【俄罗斯方块】游戏
下面的图片是众所周知的俄罗斯方块中的一个个方块,如果在俄罗斯方块这个游戏中,每个不同的方块都是一个实例对象;
如果在游戏中,每出现一个方块,我们都需要实例化这些对象,就要占用很多的内存空间,下面利用享元模式进行实现:
对于方块,我们可以对其属性进行抽取:
- 形状:内部状态
- 颜色:外部状态
实例类图:
-
Flyweight:
public abstract class AbstractBox { public abstract String getShape(); public void display(String color) { System.out.println(color + "-->" + this.getShape() + "型方块"); } }
-
Concrete Flyweight:
//I型 方块 public class IBox extends AbstractBox{ @Override public String getShape() { return "I"; } } //L型 方块 public class