创造型模式-抽象工厂

本文深入解析了抽象工厂模式,一种常用的软件设计模式,通过实例展示了如何利用此模式创建一系列相关或相互依赖的对象,而不指定它们具体的类。文章通过创建不同品牌汽车的零件,如奔驰、宝马和通用汽车,演示了抽象工厂模式的实现方式。

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


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

 


 

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

【基类】

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值