设计模式之享元模式

享元模式

享元模式就像共享单车。

众所周知共享单车存在外部资源和内部资源,

外部你使用可以调整座位高矮。内部信息是该共享单车存在一个特有的id或其他信息,这些信息外部无法改变和直接使用。

例如数据库连接池,我们的connection实例一开始就创建。当你使用就拿来使用,使用完继续放回数据库连接池,

其中你可以使用不同的sql语句就是外部资源信息、内部资源就是其中连接实例的账号、密码、url.

package com.wei.model8;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

public class Test {
  public static void main(String[] args) {
    test();
  }
  public static void  test(){
    ObjectPool<Person> pool = new ObjectPool();
    //个体对象池添加实例
    pool.addInstance(new Person(1));
    pool.addInstance(new Person(2));

    //从对象池去除对象
    Person person = pool.GetInstance();
    person.print();

    Person person2 = pool.GetInstance();
    person2.print();
    //使用完毕回收
    person2.Back();

    Person person3 = pool.GetInstance();
    person3.print();
  }
  public static void getData(){
    Date date = new Date();
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("ss:SS");
    System.out.println(simpleDateFormat.format(date));
  }
}

//对象池

class ObjectPool<T> {
  private List<T> list=new LinkedList<>();
  public void setList(List<T> list){
    this.list=list;
  }
  public void addInstance(Inside t){
    if(t != null){
        list.add((T)t);
    }
  }
  //取对象
  public T GetInstance(){
    for (T _t : list) {
      Inside t=(Inside)_t;
      if(!t.isActive()){
        t.Use();
        return (T)t;
      }
    }
    return null;
  }
}


//共享对象抽象类

abstract class Inside{
  public boolean isActive() {
    return isActive;
  }
  //是否处于使用状态
  private boolean isActive;
  public void Use(){
    isActive=true;
    init();
  }
  public void Back(){
    close();
    isActive=false;
  }
  protected abstract Inside CreateInstance(Object[] arms);
  //关闭时回调的方法
  protected void close(){};
  //关闭时开启的方法
  protected void init(){};
}

//共享实体类

class Person extends Inside{
  int id;
  @Override
  protected Inside CreateInstance(Object[] arms) {
    return new Person((int)arms[0]);
  }
  @Override
  protected void close() {
//    System.out.println("收尾");
  }
  @Override
  protected void init() {
//    System.out.println("初始化");
  }
  public void print(){
    System.out.print("");
  }
  public Person(int id) {
    this.id = id;
  }
}

上面我写了一个泛型对象池,主要类继承了抽象类 Inside就可以被放进对象池。

不过后来我发现这样对象就无法继承其他父类了,这样会使类变得没有了扩展性,所以还是把Inside写成接口会比较好。

//共享对象接口
interface Inside{
  public boolean isActive() ;
  public void Use();
  public void Back();
}
//共享对象
class Person implements Inside{
  private boolean isatcive;
  int id;
  public void print(){
    System.out.print("");
  }
  public Person(int id) {
    this.id = id;
  }
  @Override
  public boolean isActive() {
    return isatcive;
  }
  @Override
  public void Use() {
  }
  @Override
  public void Back() {
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序老六

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

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

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

打赏作者

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

抵扣说明:

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

余额充值