抽象工厂模式Abstract Factory

简介

有了工厂模式后,怎么还会有多一个抽象工厂呢。可以这么说,工厂模式算是抽象工厂的一个子类,而抽象工厂,可以有很多的子类。抽象工厂就是将工厂的方式抽成一个基类来。举个例子会更好一点。

举例

举一个汽车生产轮胎引擎的例子。我们先抽象出一个汽车工厂类。

public interface CarFactory {
    ITire createTire();   //创建轮胎
    IEngfine createEngfine();    //创建引擎
}

而轮胎和引擎的抽象为,这里假设轮胎分为普通轮胎和SUV轮胎,引擎也分为普通引擎和SUV引擎

public interface ITire {
    void trie();
}

public interface IEngfine {
    void engine();
}

他们的实现类为

public class NormalEngfine implements IEngfine {
    @Override
    public void engine() {
    }
}

public class NormalTire implements ITire {
    @Override
    public void trie() {
    }
}

public class SUVEngfine implements IEngfine {
    @Override
    public void engine() {
    }
}

public class SUVTire implements ITire {
    @Override
    public void trie() {
    }
}

现在,假定我要生产一个普普通通的配件,也就是普通轮胎和普通引擎,现在,我创建一个普通工厂类专门来生产

public class NormalFactory implements CarFactory{
    @Override
    public ITire createTire() {
        return new NormalTire();
    }

    @Override
    public IEngfine createEngfine() {
        return new NormalEngfine();
    }
}

如果我要生产SUV配件,也就是SUV轮胎和SUV引擎,就可以创建个SUVFactory

public class SUVFactory implements CarFactory {
    @Override
    public ITire createTire() {
        return new SUVTire();
    }

    @Override
    public IEngfine createEngfine() {
        return new SUVEngfine();
    }
}

有人可能就会问啦,为什么要这样啊,创建两个子类出来搞,为什么不直接一个类,然后根据类型去获取对应的型号呢,也就是

public class GeneralFactory implements CarFactory {
    @Override
    public ITire createTire(int type) {
        switch (type)
        {
            case 0:return new NormalTire();
            case 1:return new SUVTire();
        }
        return null;
    }

    @Override
    public IEngfine createEngfine(int type) {
        switch (type)
        {
            case 0:return new NormalEngfine();
            case 1:return new SUVEngfine();
        }
        return null;
    }
}

当然,从实现的角度上看,结果肯定是可行的,但是扩展性太差了,如果此时我想要再添加一个生产普通排气管,普通轮胎,普通引擎的方法,你是不要要在GeneralFactory更改Type,以及每一个方法。如果我又想要生产普通方向盘,手柄这些呢。如果用了抽象工厂的话,只需要继承现有工厂类就可以实现扩展了,扩展性就比较好。

当然抽象工厂方法弊端也有, 不仅需要扩展新的 工厂类 还要扩展 新的组件类 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值