背景
与敌军的战斗正处于白热化阶段,军备的供给却迟迟没有到来。于是,我们的军需人员探访了武器工厂,希望了解一下具体情况,结果令人大吃一惊!
原来这家武器工厂规模不大,秉承存手工制作,并针对每一台机体制作合适的武器,即使这些武器看起来并没有什么区别。这样就导致了产量一直低下,远远达不到我方的需求。
指挥官很愤怒,直接开除了军需人员,并要求马上更换武器提供商,这次的武器提供商究竟能不能达到我们的要求?我们拭目以待!
实现
武器接口
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
第一次生产火神炮,然后存起来
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
已经存在该武器,不用再浪费时间重新创建了~~
火神炮,伤害最弱的那种~~
-------
第一次生产冲击步枪,然后存起来
冲击步枪!八百里开外,一枪干掉鬼子的狙击枪!
已经存在该武器,不用再浪费时间重新创建了~~
冲击步枪!八百里开外,一枪干掉鬼子的狙击枪!
已经存在该武器,不用再浪费时间重新创建了~~
冲击步枪!八百里开外,一枪干掉鬼子的狙击枪!
已经存在该武器,不用再浪费时间重新创建了~~
冲击步枪!八百里开外,一枪干掉鬼子的狙击枪!
已经存在该武器,不用再浪费时间重新创建了~~
冲击步枪!八百里开外,一枪干掉鬼子的狙击枪!
-------
第一次生产狮子王剑,然后存起来
狮子王剑!王者之剑,乃天下第一剑!
已经存在该武器,不用再浪费时间重新创建了~~
狮子王剑!王者之剑,乃天下第一剑!
总结
本例使用享元模式实现武器工厂
优点
- 降低内存开销,减少OOM异常发生的概率;
- 因为Java创建对象需要时间,所以可以加快程序的运行速度。
应用
- 数据库连接池
- String常量池等