享元模式

一、什么是享元模式?

享元模式(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");
        }
    }

}

五、测试结果:

打折
卖书
赠送代金卷
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值