享元模式

享元模式

  • 摘要
  • 一、享元模式
  • 二、享元模式的实现
    • 2.1 场景设计
    • 2.2 代码实现
      • 2.2.1 Student 学生抽象类
      • 2.2.2 CollegeStudent 学生具体类
      • 2.2.3 StudentFactory 学生工厂类
      • 2.2.4 Main 测试类
      • 2.2.5 测试结果
  • 三、享元模式的UML图

摘要

  本文通过简洁的模式描述,应用场景的详细代码实现,以及匹配的UML,详解介绍了享元模式的原理及应用。本文可帮助读者快速掌握享元模式,以便工作学习中使用享元模式。

一、享元模式

  在生活中,我们身边有很多工具,当我们需要某一个工具时,首先是查看自己是否拥有该工具,如果没有工具,则去买或制作一个,如果有工具,则直接拿来用,用完放在原处,等待下一次使用,但决不会马上销毁该工具。
  在编程中,某些对象也扮演着工具角色,它会被频繁使用,如果每次使用时再创建,同时用完即销毁,这样会消耗太多资源,同时效率不高。
  享元模式就是指让对象元素可以进行共享,就解决了频繁使用的麻烦。享元模式在对象创建工厂中加入缓存技术即可。当需要创建一个对象时,先查看工厂中是否已经创建,如果创建了,则调用已有的对象,如果还没创建则进行创建。

二、享元模式的实现

2.1 场景设计

  在学校系统中,经常会用到各个学生对象,如果用到时创建,用完时销毁,效率太低。所以需要加入享元模式。

2.2 代码实现

2.2.1 Student 学生抽象类

package ft.patterns.Flyweight;

public interface Student {
	// subject作为外蕴状态  对一个具体对象是变动数据
	public void study(String subject);
}

2.2.2 CollegeStudent 学生具体类

package ft.patterns.Flyweight;

public class CollegeStudent implements Student{
	// 内蕴状态 对于一个具体对象是不变数据
	String name;
	
	// 不变数据作为构造参数传进入
	CollegeStudent(String name){
		this.name = name;
	}
	
	// 变动数据作为方法参数传入
	@Override
	public void study(String subject) {
		System.out.println(name+" is starting "+subject);
	}
}

2.2.3 StudentFactory 学生工厂类

package ft.patterns.Flyweight;

import java.util.HashMap;
import java.util.Map;

public class StudentFactory {
	public static Map<String,Student> studentMap;
	
	static {
		studentMap = new HashMap<String,Student>();
	}
	
	public static Student getStudent(String name) {
		Student student = null;
		if(!studentMap.containsKey(name)) {
			student = new CollegeStudent(name);
			studentMap.put(name, student);
		}
		else {
			student = studentMap.get(name);
		}
		return student;
	}
}

2.2.4 Main 测试类

package ft.patterns.Flyweight;

public class Main {
	public static void main(String[] args) {
		Student Tom = StudentFactory.getStudent("Tom");
		Student Damon = StudentFactory.getStudent("Damon");
		
		Tom.study("Math");
		Damon.study("Computer");
		
		Student Tom1 = StudentFactory.getStudent("Tom");
		Student Damon1 = StudentFactory.getStudent("Damon");	
		
		System.out.println("Tom  ====> "+Tom);
		System.out.println("Tom1  ====> "+Tom1);
		
		System.out.println("Damon  ====> "+Damon);
		System.out.println("Damon1  ====> "+Damon1);
	}
}

2.2.5 测试结果

Tom is starting Math
Damon is starting Computer
Tom ====> ft.patterns.Flyweight.CollegeStudent@5caf905d
Tom1 ====> ft.patterns.Flyweight.CollegeStudent@5caf905d
Damon ====> ft.patterns.Flyweight.CollegeStudent@27716f4
Damon1 ====> ft.patterns.Flyweight.CollegeStudent@27716f4

三、享元模式的UML图

享元模式_第1张图片

你可能感兴趣的:(设计模式)