• 设计模式-享元模式


    享元模式:相同的对象只保存一份,降低了因为大幅创建相同对象来对系统的额外开销

    享元模式分为4个角色,非享元对象,抽象享元角色,具体享元角色,享元工厂。非享元角色是享元角色的一个参数,如果需要经常需要调用非享元对象,可能会创建很多的享元角色,这时候可以从享元工厂里获取具体的享元角色,使用一个map存放对象,如果对象已经存在直接返回,不存在就创建

    非享元对象

    public class Person {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Person(String name) {
            this.name = name;
        }
    }

    抽象享元角色

     interface Animal {
       void   eat(Person person);
    }

    具体享元角色

    public class Dog implements Animal {
       private String name;
    
        public Dog(String name) {
            this.name = name;
        }
    
        @Override
        public void eat(Person person) {
            System.out.println(person.getName()+"在喂小狗吃东西");
        }
    }

    享元工厂

    public class AnimalFactory {
        private HashMap<String,Animal> animals =new HashMap<>();
        public Animal getAnimal(String name){
            Animal animal = animals.get(name);
            if(animal!=null){
                System.out.println("此享元对象已经存在,直接获取");
            }else{
                 animal = new Dog(name);
                 animals.put(name,animal);
            }
            return animal;
        }
    }

    测试类

    public class Client {
        public static void main(String[] args) {
            AnimalFactory animalFactory = new AnimalFactory();
            Animal A = animalFactory.getAnimal("小狗A");
            Animal B = animalFactory.getAnimal("小狗B");
            Animal C = animalFactory.getAnimal("小狗C");
            Animal A1 = animalFactory.getAnimal("小狗A");
            A.eat(new Person("主人A"));
            A.eat(new Person("主人B"));
            A.eat(new Person("主人C"));
            A.eat(new Person("主人D"));
        }
    }

    在上述代码里,拥有相同name属性的Dog类只会创建一个,避免了因为重复创建Dog而对系统的额外开销

    应用场景:当系统中存在大量相同或相似的对象可以来使用享元模式,但是因为享元结构是存在一个额外的数据结构里(此处是Map),这也是一个额外的维护成品,所以需要相同的对象足够多时才有必要使用享元模式。

    不和别人一样,不复制只真正理解
  • 相关阅读:
    进程和线程的区别?什么时候用进程?什么时候用线程?----看到好的复制到自己的园子里哈哈
    HTTPS详细讲解一篇就够了
    MySQL存储过程
    Spring注入全局的HttpServletRequest
    Java进阶必备
    Java8新特性
    java.time包常用类API学习记录
    Maven常用插件
    maven-dependency-versions-check-plugin, Maven 插件查找依赖版本冲突
    Jackson自定义注解
  • 原文地址:https://www.cnblogs.com/Vinlen/p/12791807.html
Copyright © 2020-2023  润新知