zoukankan      html  css  js  c++  java
  • 北风设计模式课程---享元模式与单例模式区别

    北风设计模式课程---享元模式与单例模式区别

    一、总结

    一句话总结:

    不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例

    1、享元模式与单例模式区别?

    级别:单例模式是类级别的,一个类只能有一个对象实例;享元模式是对象级别的,可以有多个对象实例,多个变量引用同一个对象实例;
    对象个数:享元模式可以再次创建对象 也可以取缓存对象,单例模式则是严格控制单个进程中只有一个实例对象

    2、享元模式与单例模式的共同点?

    实现节省对象创建的时间
    节约内存资源

    二、享元模式与单例模式区别

    转自或参考:享元模式与单例模式区别
    https://blog.csdn.net/fanchengkai1218/article/details/51840612

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fanchengkai1218/article/details/51840612

    单例模式是类级别的,一个类只能有一个对象实例;

    享元模式是对象级别的,可以有多个对象实例,多个变量引用同一个对象实例;

    享元模式主要是为了节约内存空间,提高系统性能,而单例模式主要为了可以共享数据;

    1:单例模式

    public class Singleton {
    // 我来写一个单例模式 懒汉式
    private static Singleton singleton;
    private Singleton(){}

    public static synchronized Singleton getSingleton(){
    if(singleton==null){
    singleton=new Singleton();
    }
    return singleton;
    }
    public static void main(String[] args) {
    Singleton instance1 = Singleton.getSingleton();
    Singleton instance2 = Singleton.getSingleton();
    System.out.println(instance1==instance2);
    }
    }

    2:享元模式

    //享元模式是多个变量公用一个对象实例 大大节约了内存空间 提高了系统性能 String类是final类型 就是使用了享元模式
    //数据库连接池 线程池也是享元模式的应用
    public abstract class Flyweight {
    // 享元模式 享元抽象类
    public abstract void operation();
    }

     

    //具体类 享元实现类
    public class CreateFlyweight extends Flyweight {

    private String str;

    public CreateFlyweight(String str) {
    this.str = str;
    }

    @Override
    public void operation() {
    // TODO Auto-generated method stub
    System.out.println("Create---Flyweight:" + str);
    }

    public static void main(String[] args) {
    Flyweight flyweight = new CreateFlyweight("fanck");
    flyweight.operation();
    }

    }

    //工厂方法类 维护一个对象存储池 享元工厂类
    public class FlyweightFactory {
    private Hashtable flyweights = new Hashtable();

    public FlyweightFactory() {
    };

    public Flyweight getFlyweight(Object obj) {
    Flyweight flyweight = (Flyweight) flyweights.get(obj);
    if (flyweight == null) {
    flyweight = new CreateFlyweight((String) obj);
    flyweights.put(obj, flyweight);
    }
    return flyweight;
    }

    public int getFlyweightSize() {
    System.out.println("flyweights:"+flyweights);
    return flyweights.size();
    }

    public static void main(String[] args) {
    FlyweightFactory flyweightFactory = new FlyweightFactory();
    Flyweight fly1 = flyweightFactory.getFlyweight("abc");
    Flyweight fly2 = flyweightFactory.getFlyweight("b");
    Flyweight fly3 = flyweightFactory.getFlyweight("abc");
    Flyweight fly4 = flyweightFactory.getFlyweight("ef");
    Flyweight fly5 = flyweightFactory.getFlyweight("ef");
    Flyweight fly6 = flyweightFactory.getFlyweight("ef");
    fly1.operation();
    fly2.operation();
    fly3.operation();
    fly4.operation();
    fly5.operation();
    fly6.operation();
    System.out.println(flyweightFactory.getFlyweightSize());
    }
    }


    享元模式可以再次创建对象 也可以取缓存对象

    单例模式则是严格控制单个进程中只有一个实例对象

    享元模式可以通过自己实现对外部的单例 也可以在需要的使用创建更多的对象

    单例模式是自身控制 需要增加不属于该对象本身的逻辑

    两者都可以实现节省对象创建的时间 ThreadPool 线程池 与数据库连接池 都有使用享元模式

     
  • 相关阅读:
    bzoj3505 数三角形 组合计数
    cogs2057 殉国 扩展欧几里得
    cogs333 荒岛野人 扩展欧几里得
    bzoj1123 BLO tarjan求点双连通分量
    poj3352 road construction tarjan求双连通分量
    cogs1804 联合权值 dp
    cogs2478 简单的最近公共祖先 树形dp
    cogs1493 递推关系 矩阵
    cogs2557 天天爱跑步 LCA
    hdu4738 Caocao's Bridge Tarjan求割边
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/11029076.html
Copyright © 2011-2022 走看看