设计模式之抽象工厂模式

抽象工厂模式

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。上一节讲到简单工厂模式,那抽象工厂模式就是简单工厂的升级版。不止是简单工厂一个工厂,而是N个工厂。一个具体工厂会有个产品族。而每一个具体工厂创建属于同一个产品族,但是分属于不同等级结构的产品。

这里写图片描述

从图里可以看出简单工厂的身影,其实相当把多个简单工厂再进行管理。这次也是奶茶的例子,比如奶茶店扩大规模,要在各地方建设奶茶店,但是每个地方奶茶风格都不同。东部奶茶店有东部珍珠奶茶,西部奶茶店有西部珍珠奶茶。这时每个奶茶店需要独立出一个工厂。

代码示例

奶茶抽象工厂类,并且定义创建奶茶方法。

    public interface MilkTeaFactory {
        MilkTea createMilkTea(String type);
    }

奶茶抽象类,用于定义规范。

    public abstract class MilkTea {}

两个具体奶茶工厂类。根据传进的类型返回奶茶实例。


    //西部奶茶工厂
    public class WestMilkTeaFactory implements MilkTeaFactory{

        public MilkTea createMilkTea(String type) {
            MilkTea milkTea = null;
            if (type.equals("珍珠奶茶")) {
                milkTea = new WestPearlMilkTea();
            } else if (type.equals("抹茶奶茶")) {
                milkTea = new WestMatchalMilkTea();
            }
            return milkTea;
        }

    }

    //东部奶茶工厂
    public class EastMilkTeaFactory implements MilkTeaFactory{

        public MilkTea createMilkTea(String type) {
            MilkTea milkTea = null;
            if (type.equals("珍珠奶茶")) {
                milkTea = new EastPearlMilkTea();
            } else if (type.equals("抹茶奶茶")) {
                milkTea = new EastMatchalMilkTea();
            }
            return milkTea;
        }

    }

客户端

    MilkTeaFactory factory = new EastMilkTeaFactory();
    MilkTea milkTea = factory.createMilkTea("珍珠奶茶");//东部的珍珠奶茶

    factory = new WestMilkTeaFactory();
    milkTea = factory.createMilkTea("抹茶奶茶");//西部的抹茶奶茶

抽象工厂模式符合依赖倒置原则,依赖抽象而不依赖具体。如果西部奶茶换成东部奶茶,直接替换相应的子类。该模式缺点也非常明显,需要多个产品族才能发挥作用,也导致类膨胀。所以这模式并不常见。

工厂方法

除了简单工厂,抽象工厂模式。还有一种常见的方法,那就是工厂方法。工厂方法并不属于模式,只是一个方法。对外提供静态方法,作用是创建实例并且返回。通常实例不多都采取这种方式,类也不用扩充。

    public static MilkTea createMilkTea(String type) {
        MilkTea milkTea = null;
        if (type.equals("珍珠奶茶")) {
            milkTea = new PearlMilkTea();
        } else if (type.equals("抹茶奶茶")) {
            milkTea = new MatchalMilkTea();
        }
        return milkTea;
    }

总述

总的来说,抽象工厂需要很多的产品族才能发挥作用,平时不常见也不常用。不足之处望指教。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值