厚积薄发打卡Day39 :[itcast] GoF23通俗易懂的设计模式之 <享元模式>

前言:

视频教程:黑马程序员Java设计模式详解,全网最全23种Java设计模式

什么是设计模式?

  • 设计模式(Design Pattern)是前辈们对代码开发经验的总结,是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。
  • 1995年,GoF(Gang of Four,四人组)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了23种设计模式,人称 【GoF设计模式】
设计模式分类 具体模式
创建型模式:
它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。
⌛单例模式、⌛工厂模式、⌛抽象工厂模式、⌛建造者模式、⌛原型模式
结构型模式:
结构型模式描述如何将类或对象按某种布局组成更大的结构。
⌛适配器模式、⌛桥接模式、⌛装饰模式、⌛代理模式、⌛外观模式、⌛组合模式、⌛享元模式、
行为型模式:
这些设计模式特别关注对象之间的通信。
模板方法模、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式

享元模式

概述:

定义:

享元模式(Flyweight):

运用共享技术有效地支持大量细粒度的对象.[DP]

​ 它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。

结构:

享元(Flyweight )模式中存在以下两种状态:

  1. 内部状态,即不会随着环境的改变而改变的可共享部分。
  2. 外部状态,指随环境改变而改变的不可以共享的部分。

享元模式的实现要领就是区分应用中的这两种状态,并将外部状态外部化。

类图:

图源:《大话设计模式》【程杰,著】

在这里插入图片描述

  • 抽象享元角色(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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值