Java设计模式—抽象工厂

工厂方法的缺点

之前我们说过了Java设计模式—工厂方法,它的好处就是降低了耦合度,使我们能够更专注做自己的事情。但是有一点很不好,每一个产品都对应一个工厂,也就是说,将来我们要增加产品时,还要增加与之对应的工厂类,这样当项目相对大起来之后,会类爆炸,因此在实际开发中,更加常用的是抽象工厂。

产品等级结构和产品族

产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类分别是海尔电视机,TCL电视机,海信电视机,则电视机和其子类形成了产品等级结构
产品族:在抽象工厂中,产品族是由同一个工厂生产的,位于不同产品等级结构的一组产品,例如海尔工厂生产的海尔电视机,海尔冰箱,海尔空调构成了一个产品族

这里写图片描述

如果我们使用工厂方法,对于这6个产品,则需要6个工厂;而使用抽象工厂,则需要2个工厂就够了(与产品族对应)

模式结构和代码

一:产品类

抽象电视产品

public interface TV {
    void play();
}

具体TCL TV产品

public class TCLTV implements TV{

    @Override
    public void play() {
        System.out.println("TCL TV播放...");
    }

}

具体海尔TV产品

public class HaierTV implements TV{

    @Override
    public void play() {
        System.out.println("海尔TV播放...");
    }

}

抽象空调产品

public interface AirConditioner {
    void changeTemperature();
}

具体TCl空调产品

public class TCLAirConditioner implements AirConditioner{

    @Override
    public void changeTemperature() {
        System.out.println("TCL空调改变中...");
    }

}

具体海尔空调产品

public class HaierAirConditioner implements AirConditioner{

    @Override
    public void changeTemperature() {
        System.out.println("海尔空调改变中...");
    }

}

抽象冰箱产品

public interface Fridge {
    void working();
}

具体TCL冰箱产品

public class TCLFridge implements Fridge{

    @Override
    public void working() {
        System.out.println("TCL冰箱工作中");
    }

}

具体海尔冰箱产品

public class HaierFridge implements Fridge{

    @Override
    public void working() {
        System.out.println("海尔冰箱工作中");
    }

}

二:工厂类

抽象工厂接口

public interface Factory {
    TV productTV();
    AirConditioner productAirConditioner();
    Fridge productFridge();
}

海尔工厂

public class HaierFactory implements Factory{

    @Override
    public TV productTV() {
        return new HaierTV();
    }

    @Override
    public AirConditioner productAirConditioner() {
        return new HaierAirConditioner();
    }

    @Override
    public Fridge productFridge() {
        return new HaierFridge();
    }

}

TCL工厂

public class TCLFactory implements Factory{

    @Override
    public TV productTV() {
        return new TCLTV();
    }

    @Override
    public AirConditioner productAirConditioner() {
        return new TCLAirConditioner();
    }

    @Override
    public Fridge productFridge() {
        return new TCLFridge();
    }

}

二:测试

public class Client {

    public static void main(String[] args) {
        Factory factory = new HaierFactory();
        TV tv = factory.productTV();
        AirConditioner airConditioner = factory.productAirConditioner();
        Fridge fridge = factory.productFridge();

        tv.play();
        airConditioner.changeTemperature();
        fridge.working();
    }

}

结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值