Java设计模式-享元模式

文章目录

背景

与敌军的战斗正处于白热化阶段,军备的供给却迟迟没有到来。于是,我们的军需人员探访了武器工厂,希望了解一下具体情况,结果令人大吃一惊!
原来这家武器工厂规模不大,秉承存手工制作,并针对每一台机体制作合适的武器,即使这些武器看起来并没有什么区别。这样就导致了产量一直低下,远远达不到我方的需求。
在这里插入图片描述
指挥官很愤怒,直接开除了军需人员,并要求马上更换武器提供商,这次的武器提供商究竟能不能达到我们的要求?我们拭目以待!

实现

武器接口

public interface IWeapon {

	void desc();
	
}

火神炮武器

public class FireGunWeapon implements IWeapon {

	@Override
	public void desc() {
		System.out.println("火神炮,伤害最弱的那种~~");
	}

}

冲击步枪武器

public class ImpactRifleWeapon implements IWeapon {

	@Override
	public void desc() {
		System.out.println("冲击步枪!八百里开外,一枪干掉鬼子的狙击枪!");
	}

}

狮子王剑武器

public class LionKingSwordWeapon implements IWeapon {

	@Override
	public void desc() {
		System.out.println("狮子王剑!王者之剑,乃天下第一剑!");
	}

}

武器工厂

public class WeaponFactory {

	private static Map<String, IWeapon> weapons = new HashMap<>();

	private WeaponFactory() {
	}
	
	public static IWeapon getWeapon(String type) {
		if (null == weapons.get(type)) {
			// 如果不存在这种类型的武器,那么生产出来,然后存进武器库里面,下次就不用再次去创建了。
			IWeapon weapon = null;
			switch (type) {
			case "fireGun":
				System.out.println("第一次生产火神炮,然后存起来");
				weapon = new FireGunWeapon();
				weapons.put("fireGun", weapon);
				break;
			case "impactRifle":
				System.out.println("第一次生产冲击步枪,然后存起来");
				weapon = new ImpactRifleWeapon();
				weapons.put("impactRifle", weapon);
				break;
			case "lionKingSword":
				System.out.println("第一次生产狮子王剑,然后存起来");
				weapon = new  LionKingSwordWeapon();
				weapons.put("lionKingSword", weapon);
				break;
			default:
				break;
			}
			return weapon;
		} else {
			System.out.println("已经存在该武器,不用再浪费时间重新创建了~~");
			return weapons.get(type);
		}
	}
}

测试

public class Test {

	public static void main(String[] args) {
		System.out.println("我们需要火神炮x10,突击步枪x5,狮子王剑x2");
		for (int i=0; i<10; i++) {
			IWeapon weapon = WeaponFactory.getWeapon("fireGun");
			weapon.desc();
		}
		System.out.println("-------");
		
		for (int i=0; i<5; i++) {
			IWeapon weapon = WeaponFactory.getWeapon("impactRifle");
			weapon.desc();
		}
		System.out.println("-------");
		
		for (int i=0; i<2; i++) {
			IWeapon weapon = WeaponFactory.getWeapon("lionKingSword");
			weapon.desc();
		}
	}
	
}

测试结果

我们需要火神炮x10,突击步枪x5,狮子王剑x2
第一次生产火神炮,然后存起来
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
-------
第一次生产冲击步枪,然后存起来
冲击步枪!八百里开外,一枪干掉鬼子的狙击枪!
已经存在该武器,不用再浪费时间重新创建了~~
冲击步枪!八百里开外,一枪干掉鬼子的狙击枪!
已经存在该武器,不用再浪费时间重新创建了~~
冲击步枪!八百里开外,一枪干掉鬼子的狙击枪!
已经存在该武器,不用再浪费时间重新创建了~~
冲击步枪!八百里开外,一枪干掉鬼子的狙击枪!
已经存在该武器,不用再浪费时间重新创建了~~
冲击步枪!八百里开外,一枪干掉鬼子的狙击枪!
-------
第一次生产狮子王剑,然后存起来
狮子王剑!王者之剑,乃天下第一剑!
已经存在该武器,不用再浪费时间重新创建了~~
狮子王剑!王者之剑,乃天下第一剑!
总结

本例使用享元模式实现武器工厂
优点

  1. 降低内存开销,减少OOM异常发生的概率;
  2. 因为Java创建对象需要时间,所以可以加快程序的运行速度。

应用

  1. 数据库连接池
  2. String常量池等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值