创造型模式-抽象工厂

抽象工厂:相比工厂方法模式抽象层次更高,这就意味这抽象工厂返回一组类的工厂。与工厂模式类似,此方法会返回一个工厂,而这个工厂会返回多个子类总的一个,简单来说,抽象工厂是一个工厂对象,该对象又会返回工厂中的一个。简单说,抽象工厂是一个工厂对象,该对象又会返回工厂中的一个


  • 抽象工厂:声明一个用于完成抽象产品对象创建操作的接口。
  • 具体工厂:实现创建具体产品对象的操作。
  • 抽象产品:声明一个用于一类产品对象的接口。
  • 具体产品:定义由相应的具体过程来创建的产品的对象。
  • 客户端:使用由抽象工厂和抽象产品类声明的唯一借口。

抽象工厂模式应用方法:通过一个示例帮助我们理解一下抽象工厂。假设我们需要一辆车各部分的规格。汽车不同的零件包括车轮,后视镜,引擎和车身;不同品牌的汽车(产品类)是奔驰,宝马,通用汽车。

【基类】

package create.abstracfactory;

/**
 * 基类
 * Created by admin on 2018/11/26.
 */
public abstract class Car {

    public abstract Parts getWheels();
    public abstract Parts getMirrors();
    public abstract Parts getEngine();
    public abstract Parts getBody();


}

【奔驰】

package create.abstracfactory;

/**
 * Created by admin on 2018/11/26.
 */
public class BenQ extends Car {

    @Override
    public Parts getWheels() {
        return new Parts("BenQ_Wheels");
    }

    @Override
    public Parts getMirrors() {
        return new Parts("BenQ_Mirrors");
    }

    @Override
    public Parts getEngine() {
        return new Parts("BenQ_Engine");
    }

    @Override
    public Parts getBody() {
        return new Parts("BenQ_Body");
    }
}

【宝马】

package create.abstracfactory;

/**
 * Created by admin on 2018/11/26.
 */
public class BMW extends Car {

    @Override
    public Parts getWheels() {
        return new Parts("BMW_Wheels");
    }

    @Override
    public Parts getMirrors() {
        return new Parts("BMW_Mirrors");
    }

    @Override
    public Parts getEngine() {
        return new Parts("BMW_Engine");
    }

    @Override
    public Parts getBody() {
        return new Parts("BMW_Body");
    }
}

【通用车】

package create.abstracfactory;

/**
 * Created by admin on 2018/11/26.
 */
public class GeneralMotos extends Car {

    @Override
    public Parts getWheels() {
        return new Parts("GeneralMotos_Wheels");
    }

    @Override
    public Parts getMirrors() {
        return new Parts("GeneralMotos_Mirrors");
    }

    @Override
    public Parts getEngine() {
        return new Parts("GeneralMotos_Engine");
    }

    @Override
    public Parts getBody() {
        return new Parts("GeneralMotos_Body");
    }

}

【Parts类】

package create.abstracfactory;

/**
 * Parts的规格会因为不同品牌的汽车而不同
 * Created by admin on 2018/11/26.
 */
public class Parts {

    public String specification;

    public Parts(String spec){
        specification = spec;
    }

    public String getSpecification(){
        return specification;
    }

}

【测试类】

package create.abstracfactory;

/**
 * Created by admin on 2018/11/26.
 */
public class CarType {

    private Car car;

    public Car getCar(String carType){
        if ("BenQ".equals(carType)) {
            car = new BenQ();
        } else if ("BMW".equals(carType)) {
            car = new BMW();
        } else if ("GeneralMotors".equals(carType)) {
            car = new GeneralMotos();
        }
        return car;
    }

    public static void main(String[] args) {
        CarType carType = new CarType();
        Car car = carType.getCar("BenQ");
        System.out.println("Wheels: "+car.getWheels().getSpecification());
        System.out.println("Mirrors: "+car.getMirrors().getSpecification());
        System.out.println("Engine: "+car.getEngine().getSpecification());
        System.out.println("Body: "+car.getBody().getSpecification());
    }

}

抽象工厂模式应用场景

抽象工厂模式的主要优点之一就是屏蔽具体类的创建类的方法,实际应用的类名称不需要再让客户端知道,由于具体类是屏蔽的,因此我们可以在不同的工厂之间切换。

原文地址:https://www.cnblogs.com/airycode/p/10020940.html