抽象工厂模式

概述

抽象工厂模式比工厂方法模式抽象程度更高。工厂方法模式中具体工厂只生产一种具体产品,但在抽象工厂模式中,具体工厂可以生产相关的一组具体产品,这样一组产品称为产品族

有时候我们需要一个工厂提供多个产品对象,而不是单一一个产品对象,如一个电器设备工厂,它可以生产电视机、电冰箱、空调等设备,而不只是生成某种类型的电器。为了更清晰地理解抽象工厂模式,这里先引入两个概念:

  1. 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、TCL 电视机等,抽象电视机与具体品牌电视机之间构成了一个产品等级结构。

  2. 产品族:指由同一工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产海尔电视机、海尔电冰箱,则它们是同一产品族,各自位于不同产品等级结构。

产品族

当系统提供的工厂生产的具体产品不是一个简单对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式


模式实例

一个电器工厂可以产生多种类型的电器,如海尔工厂可以生产海尔电视机、海尔空调等,TCL 工厂可以生产 TCL 电视机、TCL 空调等,相同品牌的电器构成一个产品族,而相同类型电器构成一个产品等级结构

抽象产品类 Television

public interface Television {

    void play();
}

具体产品类 HairTelevision(海尔电视机类)

public class HairTelevision implements Television {

    @Override
    public void play() {

        System.out.println("海尔电视机播放中......");
    }
}

具体产品类 TCLTelevision(TCL电视机类)

public class TCLTelevision implements Television {

    @Override
    public void play() {

        System.out.println("TCL电视机播放中.......");
    }
}

抽象产品类 AirConditioner

public interface AirConditioner {

    void changeTemperature();
}

具体产品类 HairAirConditioner(海尔空调类)

public class HairAirConditioner implements AirConditioner {

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

具体产品类 TCLAirConditioner(TCL空调类)

public class TCLAirConditioner implements AirConditioner {

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

抽象工厂类 EFactory

public interface EFactory {

    Television produceTelevision();
   
    AirConditioner produceAirConditioner();
   }

具体工厂类 HairFactory(海尔工厂类)

public class HairFactory implements EFactory {

    @Override
    public Television produceTelevision() {
        return new HairTelevision();
    }

    @Override
    public AirConditioner produceAirConditioner() {
        return new HairAirConditioner();
    }
}

具体工厂类 TCLPFactory

public class TCLFactory implements EFactory {

    @Override
    public Television produceTelevision() {
        return new TCLTelevision();
    }

 @Override
    public AirConditioner produceAirConditioner() {
     return new TCLAirConditioner();
    }
}
posted @ 2020-03-07 21:15  低吟不作语  阅读(817)  评论(0编辑  收藏  举报