【spring6】工厂模式的三种形态

1.简单工厂模式

       不属于23种设计模式之一。简单工厂模式又叫静态工厂方法模式,是工厂方法模式特殊实现。

        简单工厂模式的角色包括三个:1)抽象产品角色;2)具体产品角色;3)工厂类角色

//抽象产品类
public abstract class Weapon {
    //武器攻击行为
    public abstract void attack();
}

//具体产品角色
public class Tank extends Weapon{
    @Override
    public void attack() {
        System.out.println("坦克攻击!");
    }
}
public class Fighter extends Weapon{
    @Override
    public void attack() {
        System.out.println("飞机攻击!");
    }
}

//工厂类角色
public class WeaponFactory {
    //根据武器类型生产武器
    public static Weapon get(String weaponType){
        if (weaponType == null || weaponType.trim().length() == 0) {
            return null;
        }
        Weapon weapon = null;
        if ("TANK".equals(weaponType)) {
            weapon = new Tank();
        } else if ("FIGHTER".equals(weaponType)) {
            weapon = new Fighter();
        } else {
            throw new RuntimeException("不支持该武器!");
        }
        return weapon;
    }
}

   简单工厂模式的优点:

     客户端程序不需要关心对象的创建细节,需要哪个对象时,只需要调用工厂类,初步实现了责任的分离。客户端只负责“消费”,工厂负责“生产”。生产和消费分离。

  简单工厂模式的缺点:

     工厂类集中了所有产品的创造逻辑,一旦出问题,整个系统瘫痪;不符合OCP开闭原则,在进行系统扩展时,需要修改工厂类。

2.工厂方法模式

        23种设计模式之一。

        工厂方法模式的角色包括:1)抽象产品角色;2)具体产品角色;3)抽象工厂角色;4)具体工厂角色

//抽象产品类
public abstract class Weapon {
    //武器攻击行为
    public abstract void attack();
}

//具体产品角色
public class Tank extends Weapon{
    @Override
    public void attack() {
        System.out.println("坦克攻击!");
    }
}
public class Fighter extends Weapon{
    @Override
    public void attack() {
        System.out.println("飞机攻击!");
    }
}

//抽象工厂角色
public interface WeaponFactory {
    Weapon get();
}

//具体工厂角色
public class TankFactory implements WeaponFactory{
    @Override
    public Weapon get() {
        return new Tank();
    }
}
public class FighterFactory implements WeaponFactory{
    @Override
    public Weapon get() {
        return new Fighter();
    }
}

  工厂方法模式的优点:

      符合OCP原则,想扩展一个新的产品,只要新增一个产品类,再新增一个该产品对应的工厂即可;屏蔽产品的具体实现,调用者只关心产品的接口。            

  工厂方法模式的缺点:     

       每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。   

3.抽象工厂模式

        23种设计模式之一。

        工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。

        抽象工厂模式的角色包括:1)抽象产品角色;2)具体产品角色;3)抽象工厂角色;4)具体工厂角色

//抽象工厂类
public abstract class AbstractFactory {
    public abstract Weapon getWeapon(String type);
    public abstract Fruit getFruit(String type);
}

//具体工厂类
public class WeaponFactory extends AbstractFactory{

    public Weapon getWeapon(String type){
        if (type == null || type.trim().length() == 0) {
            return null;
        }
        if ("Gun".equals(type)) {
            return new Gun();
        } else if ("Dagger".equals(type)) {
            return new Dagger();
        } else {
            throw new RuntimeException("无法生产该武器");
        }
    }

    @Override
    public Fruit getFruit(String type) {
        return null;
    }
}

  抽象工厂模式的优缺点:

      优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

      缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在AbstractFactory里加代码,又要在具体的里面加代码。

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值