设计模式之享元模式

什么是享元模式

享元,共享的元素,什么叫共享,就是把东西分享出来,放到一个地方,可以让其他人享用。然而在程序中,这个元素我们可以暂时理解为各种对象、各种类,把他们放到一个数组里,方便统一管理和调用。说起来有点像注册模式和组合模式,都是把类给放到数组里,但是区别是注册模式中的数组元素间没有必然联系,不相互依赖;组合模式是树形结构,具有层级依赖,同级之间不依赖,并且这些元素大致相同,因为它们继承于同一个接口;享元模式类似于组合模式,只不过它采用了一个单独的工厂类来存储类的实例,它的每个元素都必须是至少两个类的组合构成。

使用场景

比如发送短信,有x个第三方短信平台阿里云、腾讯,有m个短信模板,有n个收信人,一共三个对象。如果用传统的开发模式,则每次发送短信的时候都要实例化一个平台类、一个模板类和一个收信人类,那么需要xmn个同样的操作才能给所有人发送短信,显然性能很低。此时就适合享元模式,把怕平台和模板的组合存到数组里,随用随取,减少类的创建,降低资源消耗。

示意图

优点

减少类的创建,节省系统资源,提升性能,并且易扩展,符合设计原则的单一原则和开闭原则。

代码实例

目录结构

 

Message.php 短信平台接口类

interface Message{

    /**
     * 发送短信
     * @param User $user
     * @return mixed
     */
    function send(User $user);
}

 Ali.php 阿里短信平台类

class Ali implements Message{
    public $template; //短信模板类
    public function __construct(Template $template)
    {
        //设置短信模板
        $this->template = $template;
    }

    public function send(User $user)
    {
        // TODO: Implement send() method.
        echo "<pre>";
        echo '用阿里云短信向'.$user->name.'发送:'.$this->template->getTemplate().PHP_EOL;
    }
}

Tx.php 腾讯短信平台类

class Tx implements Message{
    public $template;//短信模板类
    public function __construct(Template $template)
    {
        //设置短信模板
        $this->template = $template;
    }

    public function send(User $user)
    {
        // TODO: Implement send() method.
        echo '用阿里云短信向'.$user->name.'发送:'.$this->template->getTemplate(),PHP_EOL;
    }
}

Template.php 短信模板类

class Template{
    public $template; //短信模板
    public function __construct($template)
    {
        //设置短信模板
        $this->template = $template;
    }

    /**
     * 获取短信模板
     * @return mixed
     */
    function getTemplate(){
        return $this->template;
    }
}

Factory.php 享元工厂类

<?php
class Factory{
    public $message=[];

    /**
     * 根据key获取要使用的发短信类实例
     * @param $key
     * @param $template
     * @return mixed
     */
    function getMessage($key,$template){
        if (!isset($this->message[$key])){
            $this->message[$key] = $template;
        }

        return $this->message[$key];
    }

    //调用平台的send方法发送短信
    function send($user){
        foreach ($this->message as $message){
            $message->send($user);
        }
    }
}

User.php 收信人类

<?php
class User{
    public $name;//用户名

    public function __construct($name)
    {
        //设置用户名
        $this->name = $name;
    }

    /**
     * 获取用户名
     * @return mixed
     */
    function getName(){
        return $this->name;
    }
}

client.php 调用

<?php
require_once 'Message.php';
require_once 'Ali.php';
require_once 'Template.php';
require_once 'Tx.php';
require_once 'User.php';
require_once 'Factory.php';

//初始化三个短信模板
$template1 = new Template('模板1');
$template2 = new Template('模板2');
$template3 = new Template('模板3');

//阿里云平台类与模板类绑定
$ali1 = new Ali($template1);
$ali2 = clone $ali1;
$ali3 = clone $ali1;
$ali2->template = $template2;
$ali3->template = $template3;

//腾讯平台类与模板类绑定
$tx1 = new Tx($template1);
$tx2 = clone $tx1;
$tx3 = clone $tx1;
$tx2->template = $template2;
$tx3->template = $template3;

//享元工厂存储这些绑定关系
$factory = new Factory();
$factory->getMessage(md5($template1->template.'ali'),$ali1);//存储阿里云平台与模板1的绑定
$factory->getMessage(md5($template2->template.'ali'),$ali2);//存储阿里云平台与模板2的绑定
$factory->getMessage(md5($template3->template.'ali'),$ali3);//存储阿里云平台与模板3的绑定

$factory->getMessage(md5($template1->template.'tx'),$tx1);//存储阿里云平台与模板1的绑定
$factory->getMessage(md5($template3->template.'tx'),$tx3);//存储阿里云平台与模板3的绑定

//收信人
$user1 = new User('王五');
$user2 = new User('李四');

//分别发送
$factory->send($user1);
$factory->send($user2);

运行结果

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
享元设计模式(Flyweight Design Pattern)是一种用于优化大量对象创建和使用的设计模式。在Android开发中,使用享元模式可以有效地减少内存消耗和提高性能。 在享元模式中,对象被分为两种状态:内部状态和外部状态。内部状态是不变的,可以被多个对象共享,而外部状态是可变的,每个对象都有自己的外部状态。 在Android中,典型的例子是使用Bitmap对象来显示图片。当需要显示多个相同的图片时,可以使用享元模式来共享已加载的Bitmap对象,而不是每次都创建新的Bitmap对象。 以下是一个简单的示例代码: ```java public class BitmapFactory { private Map<String, Bitmap> bitmapCache = new HashMap<>(); public Bitmap getBitmap(String path) { Bitmap bitmap = bitmapCache.get(path); if (bitmap == null) { // 如果缓存中没有该Bitmap对象,则创建新的Bitmap对象 bitmap = BitmapFactory.decodeFile(path); bitmapCache.put(path, bitmap); } return bitmap; } } ``` 在上面的示例中,`BitmapFactory` 类使用一个 `bitmapCache` Map 来缓存已加载的 Bitmap 对象。当需要获取 Bitmap 对象时,首先从缓存中查找,如果找到则返回缓存的对象,否则创建新的 Bitmap 对象并存入缓存。 通过使用享元模式,可以避免重复创建相同的 Bitmap 对象,从而减少内存消耗。这在需要频繁加载和显示大量图片的应用中非常有用。 需要注意的是,享元模式适用于有大量相似对象的情况,并且需要权衡共享对象和创建对象的开销。在某些情况下,过度使用享元模式可能会导致代码复杂化,降低可读性和可维护性。因此,在使用享元模式时应根据实际情况进行评估和折衷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对这是我的昵称

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值