java23种设计模式十(连载)

十、享元模式

享元模式(Flyweight Pattern)顾名思义,就是多个对象共享一个对象,即共用一个内存地址,在实际应用中,采用享元模式的好处就是可以大大节约内存空间,提高系统的运行效率。享元模式经常会出现在工厂模式当中,下面是具体的实现代码:

首先创建一个享元类:

public abstract class Flyweight {

	public abstract void operation();
}
/**
 * 具体的享元类
 * @author Lynn
 *
 */
public class ConcreteFlyweight extends Flyweight {

	private String str;
	public ConcreteFlyweight(String str){
		this.str = str;
	}

	@Override
	public void operation() {
		System.out.println(str);
	}

}

然后创建一个工厂类,用于实体化享元类:

import java.util.Hashtable;

public class FlyweightFactory {

	private Hashtable<Object, Flyweight> flyweights = new Hashtable<>();
	public Flyweight getFlyweight(Object obj){
		Flyweight flyweight = flyweights.get(obj);
		if(null == flyweight){
			flyweight = new ConcreteFlyweight((String)obj);
			flyweights.put(obj, flyweight);
		}
		return flyweight;
	}

	public int getFlyweightSize(){
		return flyweights.size();
	}
}

这里采用hashtable保存每个享元对象,以便下次直接使用,下面是测试方法:

public class Client {

	FlyweightFactory factory = new FlyweightFactory();
	Flyweight fly1;
	Flyweight fly2;
	Flyweight fly3;
	Flyweight fly4;
	Flyweight fly5;
	Flyweight fly6;  

	public Client(){
		fly1 = factory.getFlyweight("1");
		fly2 = factory.getFlyweight("2");
		fly3 = factory.getFlyweight("1");
		fly4 = factory.getFlyweight("1");
		fly5 = factory.getFlyweight("1");
		fly6 = factory.getFlyweight("1");
	}
	public void showFlyweight(){
		fly1.operation();
		fly2.operation();
		fly3.operation();
		fly4.operation();
		fly5.operation();
		fly6.operation();
		int size = factory.getFlyweightSize();
		System.out.println("size = " + size);
	}
	public static void main(String[] args){
		Client client = new Client();
		client.showFlyweight();
	}
}

这样实际上只创建了两个对象,key 为1和key为2的

1
2
1
1
1
1
size = 2

在java中,String就是一个典型的采用享元模式的例子,String是final的,不能被继承的,它也是不可变的,每次创建字符串对象都会保存到对象池中,下次使用到直接从对象池中取出字符串,而不会重新构建对象,下面的例子大家应该不陌生,

String a = "abc";

String b = "abc";

System.out.println(a==b);

“=”是比较的内存地址,这个例子当中打印为true,说明他们的内存地址一样,也就是都指向一个地址,即共享了一个对象。

时间: 2024-07-31 18:26:21

java23种设计模式十(连载)的相关文章

java23种设计模式六(连载)

六.观察者模式 定义:一种对象对另一种对象存在某种依赖关系,当一个对象发生改变的时候,需要改变另一个对象的状态. 在设计一个系统的时候,经常会有这样一个需求,如果一个对象发生改变,需要改变另一个对象的数据.比如:android客户端的一个控件ListView,当数据发生改变的时候,我们需要通知对象,刷新当前控件. 观察者模式一般有以下四个角色: 观察者:作用是观察每个对象是否需要改变 被观察者:只是一个接口,观察者观察的接口 具体的被观察者:这个是观察者具体要观察的对象 说的比较抽象,具体我们看

java23种设计模式九(连载)

九.责任链模式 通过字面意思我们大概能想到他是一个链条,每个人只负责自己可以做的事,不能做的事交给另外的人来做,这样就形成了一个链条,比如软件开发流程,客户提出了需求,但是要开发出一套完整的软件,要有美工.产品经理.程序员等角色,那么产品经理负责设计产品,产品设计完了后交给美工来做效果图,最后由程序员来实现功能.这就是一种责任链模式. 接下来请看实现的代码: public abstract class Handler { private Handler handler; public Handl

java23种设计模式八(连载)

八.代理模式 代理模式顾名思义就是构建一个代理类,来接管原来的类的工作,比如家里水管爆了,自己不修,则请工人来维修,买房子,自己请中介帮忙买,例子的工人.中介就是一个代理.下面请看代码实现: public interface Source { public void method(); } public class CocretSource implements Source { @Override public void method() { System.out.println("执行原始方

java23种设计模式七(连载)

七.调停者模式 调停者模式包装了一系列相互作用的对象,使得这些对象相互之间不必显式的引用,从而极大的降低了对象间的耦合性,调停者模式通过引入调停者作为中间人,使得对象间既不用相互作用又能相互影响. 调停者模式一般有以下几个角色: 调停者:只是一个接口,定义了同事对象到调停者对象间的接口,可以是一个或多个方法 具体的调停者:实现调停者的方法,将所有同事对象引入进来,从而负责协同各同事之间的关系 同事对象:抽象出调停者到同事对象之间的接口 具体的同事对象:实现不同同事之间具体所做的工作. 下面举个生

java23种设计模式提纲

设计模式的六大原则: 1.单一职责原则 There should never be more than one reason for a class to change. 2.接口隔离原则 Clients should not be forced to depend upon interfaces that they don't use. The dependency of one class to another one should depend on the smallest possib

java23种设计模式详解(转)

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用 设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我

java23种设计模式之十:责任链模式

最近在学习netty中发现其中用到了责任链模式,然后结合自己在写代码中遇到了大量写if...else的情况,决定学习一下责任链模式. 一.什么样的场景下会选择用责任链模式 我们在进行业务逻辑判断时,需要根据传入参数类型的不同做出不同的处理,如果在传入的参数类型相对较少的情况时,可以用if...else来做判断,这样的确是没有什么问题的,但是如果后期由于业务系统的扩展,导致参数类型会随之延伸出很多种不同的处理,这时就需要用责任链模式来抒代码重构,这样会让代码封装的更好.更简洁,阅读性更强,后期如果

Java23种设计模式学习笔记【目录总贴】

以下是各个模式的简要介绍,点击设计模式名称进入对应设计模式的详细解释页面.学习资料来源于网络,如有问题欢迎留言. 创建型模式:关注对象的创建过程 1.单例?模式:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 主要: 饿汉式(线程安全,调用效率高,但是不能延时加载) 懒汉式(线程安全,调用效率不高,但是可以延时加载) 其他: 双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题.不建议使用) 静态内部类式(线程安全,调用效率高.但是可以延时加载) 枚举单例(线程安全,调用效率高,不

java23种设计模式的有趣见解

 创建型模式 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西, 虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说"来四个鸡翅" 就行了.麦当劳和肯德基就是生产鸡翅的Factory 工厂模式:客户类和工厂类分开.消费者任何时候需要某种产品,只需向工厂请求即可 .消费者无须修改就可以接纳新产品.缺点是当产品修改时,工厂类也要做相应的修改 .如:如何创建及如何向客户端提供. 2.BUILDER-MM 最爱听的就是"我爱你&