设计模式-抽象方法模式

    看抽象方法模式之前,最好看看工厂方法模式。当成品种类越来越多,并且产品有越来越多系列的时候,工厂方法模式就有点力不从心了,按照示例中动物有猫狗,猫狗下有猫粮狗粮,当要是猫吃猫粮的时候,就需要获取猫工厂、猫粮工厂,如果不小心获取到猫工厂、狗粮工厂,那么就会出错。

    为了优化这个问题,当一个类别的产品有多个系列区分的时候,为了按照系列生产商品,那么就需要用抽象工厂进行区分。即将猫与口粮的映射关系放到抽象工厂中。

 

示例

假设新增了猫粮狗粮,那么根据工厂方法模式需要新增猫、狗粮工厂

public interface FoodFactory {

    Food getFood();
}

public class DogFoodFactory implements FoodFactory {
    @Override
    public Food getFood() {
        return new DogFood();
    }
}

public class CatFoodFactory implements FoodFactory{
    @Override
    public Food getFood() {
        return new CatFood();
    }
}

工厂方法中,当猫要吃猫粮的时候,需要获取两次工厂,有可能获取到错误的工厂

public class Test {

    public static void main(String[] args) {
        AnimalFactory catFactory = new CatFactory();
        catFactory.getAnimal();
        // 例如这里本来要获取猫粮结果获取到了狗粮
        FoodFactory dogFoodFactory = new DogFoodFactory();
        dogFoodFactory.getFood();
    }
}

为了避免上述情况产生,需要将猫和猫粮进行绑定

public abstract class AbstractFactory  {

    abstract Animal getAnimal();

    abstract Food getFood();
}
public class CatFactory extends AbstractFactory{
    @Override
    Animal getAnimal() {
        return new Cat();
    }

    @Override
    Food getFood() {
        return new Food();
    }
}

测试

public class Test {

    public static void main(String[] args) {
        AbstractFactory catFactory = new CatFactory();
        catFactory.getAnimal();
        catFactory.getFood();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值