设计模式学习之单例模式

单例模式可以说是23中设计模式中最简单的模式之一了。


单例模式,顾名思义,只有一个实例,因此这种模式只有在真正的需求“单一实例”的时候使用。它提供一种方法来确保某一特定类型有且只有一个实例。而且自行实例化,并向外部提供这个单一实例。


在它核心结构中,只包含一个被被称为单例类的特殊类(static:确保只有一个对象),并向外部提供一个全局的存取点(static method)。


单例模式的要点有三个:

    一是某个类只能有一个实例,
    二是它必须自行创建这个实例,
    三是它必须自行向整个系统提供这个实例。

从具体实现角度来说,就是以下三点:

   一是单例模式的类只提供私有的构造函数,

// private constructor method, others can not use: new Singleton();
    private Singleton() {

    }


   二是类定义中含有一个该类的静态私有对象,

private static Singleton s = new Singleton(); 
or
private static Singleton s = null; 

   三是该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象。

    // static method
    public static Singleton getReference() {

        return s;
    }


这种思想模式同样适用于创建固定数量的对象。但是这种情况下,你得面临如何共享对象池里的对象这种问题。数据库连接池就是以这种方式实现对数据库连接的管理。


下面是一个简单的连接池模拟:
   一是创建一个List,用来存储一定数量的对象,设置添加:add(),取出:get(),释放:release()。
public class PoolManager {

    private final List<PoolItem> items = new ArrayList<PoolItem>();

    public void addItem(final Object item) {

        items.add(new PoolItem(item));
    }

    public Object getItem() throws EmptyPoolException {

        for (int i = 0; i < items.size(); i++) {

            final PoolItem pItem = items.get(i);

            if (pItem.isUse == false) {
                pItem.isUse = true;
                return pItem.item;
            }
        }

        return null;
        // throw new EmptyPoolException();
    }

    public void releaseItem(final Object item) {

        for (int i = 0; i < items.size(); i++) {

            final PoolItem pItem = items.get(i);

            if (item == pItem.item) {
                pItem.isUse = false;
                return;
            }
        }

        throw new RuntimeException(item + "not found.");
    }


    // simple pool item design
    private static class PoolItem {

        boolean isUse = false;

        Object item;

        PoolItem(final Object item) {

            this.item = item;
        }
    }

    // simple empty pool exception simulation
    static class EmptyPoolException extends Exception {

        private static final long serialVersionUID = 1L;
    }
}


   二是将对象设置成Singleton。
public class ConnectionPool {

    private static PoolManager pool = new PoolManager();

    private ConnectionPool() {

    }

    public static void addConnections(final int number) {

        for (int i = 0; i < number; i++) {
            pool.addItem(new ConnectionImpl());
        }
    }

    public static Connection getConnection() throws EmptyPoolException {

        return (Connection) pool.getItem();
    }

    public static void releaseConnection(final Connection c) {

        pool.releaseItem(c);
    }
}

   三是初始化。

static {
  ConnectionPool.addConnections(4);
}

   四就是我们熟悉的获取连接了。
public void test() {

        Connection c = null;
        try {
            c = ConnectionPool.getConnection();

            c.setItem(new Object());
            c.getItem();

            ConnectionPool.releaseConnection(c);
        } catch (final EmptyPoolException e) {

            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }




本文为学习过程中收集资料总结而成,如有雷同,纯属巧合。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于PyTorch的Embedding和LSTM的自动写诗实验LSTM (Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,用于处理具有长期依赖关系的序列数据。传统的RNN在处理长序列时往往会遇到梯度消失或梯度爆炸的问题,导致无法有效地捕捉长期依赖。LSTM通过引入门控机制(Gating Mechanism)和记忆单元(Memory Cell)来克服这些问题。 以下是LSTM的基本结构和主要组件: 记忆单元(Memory Cell):记忆单元是LSTM的核心,用于存储长期信息。它像一个传送带一样,在整个链上运行,只有一些小的线性交互。信息很容易地在其上保持不变。 输入门(Input Gate):输入门决定了哪些新的信息会被加入到记忆单元中。它由当前时刻的输入和上一时刻的隐藏状态共同决定。 遗忘门(Forget Gate):遗忘门决定了哪些信息会从记忆单元中被丢弃或遗忘。它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 输出门(Output Gate):输出门决定了哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。同样地,它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 LSTM的计算过程可以大致描述为: 通过遗忘门决定从记忆单元中丢弃哪些信息。 通过输入门决定哪些新的信息会被加入到记忆单元中。 更新记忆单元的状态。 通过输出门决定哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。 由于LSTM能够有效地处理长期依赖关系,它在许多序列建模任务中都取得了很好的效果,如语音识别、文本生成、机器翻译、时序预测等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值