设计模式之抽象工厂模式

抽象工厂模式意为提供一个可以创建一组或者相关的对象的接口,跟工厂模式很相似,工厂模式创建的是同种类别下的不同产品,抽象工厂是创建多种相关类别下的不同产品。比如工厂模式是鱼,那么它对应产品可以是鲤鱼,草鱼,鲸鱼。而放到抽象工厂模式,它就不只是可以创建鱼这一类,还可以是藻类,如红藻,绿藻。还可以是鱼生活的地方,如海洋,河流,池塘,油锅。抽象工厂的模型角色跟工厂模式模型一样:

  • 1.抽象工厂:模式核心,所有具体工厂都要实现这个接口。通常是包含创建多个类别产品的方法。
  • 2.具体工厂:实现抽象工厂,根据具体需要创建具体产品对象。
  • 3.抽象产品:定义产品的共性。
  • 4.具体产品:具体的产品,拥有所有产品的共性,也拥有自己的特性。

工厂模式里拿的买饮料作为例子,这里同样使用这个。但是去饮料店有些不会只卖饮料,还可能卖面包或者还有其他。所以再抽象工厂里需要多定义出面包这类产品:

public interface DrinksFactory {
    //饮料
    Drinks dBuild();

    //面包
    Bread bBuild();

    void buyWhat();
}

抽象产品,对应的面包,饮料:

public abstract class Bread {

    public abstract String buy();
}

public abstract class Drinks {

    public abstract String otherDoSing();

}

具体产品:

public class AppleDrinks extends Drinks {

    @Override
    public String otherDoSing() {
        return "苹果汁";
    }

}

public class LemonDrinks extends Drinks {

    @Override
    public String otherDoSing() {
        return "柠檬汁";
    }

}

public class LemonBread extends Bread {

    @Override
    public String buy() {
        return "柠檬派";
    }
}

public class AppleBread extends Bread{
    @Override
    public String buy() {
        return "苹果派";
    }
}

具体工厂。这个情景下再叫工厂就不太合适了,现在比喻成两个具体的人要到这个店里面买东西,一个人偏爱苹果,另一个偏爱柠檬。

public class AppleFactory implements DrinksFactory {

    @Override
    public Drinks dBuild() {
        return new AppleDrinks();
    }

    @Override
    public Bread bBuild() {
        return new AppleBread();
    }

    @Override
    public void buyWhat() {
        Log.d("buyWhat", "buyWhat: "+dBuild().otherDoSing()+", "+bBuild().buy());
    }

}

public class LemonFactory implements DrinksFactory {

    @Override
    public Drinks dBuild() {
        return new LemonDrinks();
    }

    @Override
    public Bread bBuild() {
        return new LemonBread();
    }

    @Override
    public void buyWhat() {
        Log.d("buyWhat", "buyWhat: "+dBuild().otherDoSing()+", "+bBuild().buy());
    }
}

这俩人都买自己偏爱的食物:

        DrinksFactory factory = new AppleFactory();
        DrinksFactory factory2 = new LemonFactory();
        factory.buyWhat();
        factory2.buyWhat();

结果:

 D/buyWhat: buyWhat: 苹果汁, 苹果派
 D/buyWhat: buyWhat: 柠檬汁, 柠檬派
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

抽象工厂模式特点:

抽象工厂是工厂方法的进一步抽象,针对同个类别下的不同种对象。如果只有一种产品的话,抽象工厂模式就退化成工厂方法模式了。具有工厂模式一样的优良封装性,结构清晰,解耦。缺点是要拓展本类别对象会很复杂。需要修改抽象工厂接口,影响到其他产品工厂类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值