享元模式

来源:互联网 发布:淘宝物流重量要填多少 编辑:程序博客网 时间:2024/05/12 11:43

一、什么是享元模式?

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。  

二、享元模式的角色和职责

1、抽象享元角色: 所有具体享元类的父类,规定一些实现的公共接口。

2、具体享元角色: 抽象享元角色的具体实现类,并实现抽象类中的方法。

3、享元工厂角色: 负责创建和管理享元角色。

三、优缺点及适应场景
优点:

1、它能够极大的减少系统中对象的个数。2、由于其使用了外部状态,各个外部状态之间相对独立,不会影响到内部状态,所以享元模式使得享元对象能够在不同的环境被共享。 

缺点:

1、由于对外部状态和内部状态的区分,使得应用程序在某种程度上来说更加复杂化了。2、为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长。 

适应场景:

针对享元模式的优点:
1、由于大量相同或者类似对象的使用,导致系统内存耗费严重。
2、大量内部状态可以转化为外部状态 ,可以将其转化并传入对象中。

四、具体代码:

/**   * @Title: Person.java* @Package com.Flyweight* @Description: * @author xiaozhi   * @date 2016年12月6日 下午6:35:29* @version V1.0   */package com.Flyweight;public class Person {    private String name;    private String sex;    private String age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public String getAge() {        return age;    }    public void setAge(String age) {        this.age = age;    }    public Person(String name, String sex, String age) {        super();        this.name = name;        this.sex = sex;        this.age = age;    }    public Person() {    }}
/**   * @Title: Teacher.java* @Package com.Flyweight* @Description: TODO(用一句话描述该文件做什么)* @author xiaozhi   * @date 2016年12月6日 下午6:39:17* @version V1.0   */package com.Flyweight;public class Teacher extends Person {    private String num = null;    public Teacher(String name, String sex, String age, String num) {        super(name, sex, age);        this.num = num;    }    public void setNum(String num) {        this.num = num;    }    public Teacher() {    }}
/**   * @Title: TeacherFactory.java* @Package com.Flyweight* @Description: TODO(用一句话描述该文件做什么)* @author xiaozhi   * @date 2016年12月6日 下午6:41:07* @version V1.0   */package com.Flyweight;import java.util.HashMap;import java.util.Map;public class TeacherFactory {    // 创建享元池    private Map<String, Teacher> pool;    public TeacherFactory() {        pool = new HashMap<String, Teacher>();    }    public Teacher getTeacher(String num) {        Teacher teacher = pool.get(num);        if (teacher == null) {            teacher = new Teacher();            teacher.setName(num);            pool.put(num, teacher);        }        return teacher;    }}
/**   * @Title: MainClass.java* @Package com.Flyweight* @Description: 测试类* @author xiaozhi   * @date 2016年12月6日 下午6:35:04* @version V1.0   */package com.Flyweight;public class MainClass {    public static void main(String[] args) {        TeacherFactory factory = new TeacherFactory();        Teacher t1 = factory.getTeacher("001");        Teacher t2 = factory.getTeacher("002");        Teacher t3 = factory.getTeacher("003");        Teacher t4 = factory.getTeacher("004");        System.out.println(t1.getName());        System.out.println(t2.getName());        System.out.println(t3.getName());        System.out.println(t4.getName());        if (t1 == t2) {            System.out.println("true");        } else {            System.out.println("false");        }    }}

五、测试结果:

打折卖书赠送代金卷
0 0