设计模式-抽象工厂模式

一、抽象工厂模式(创建型模式)
1.定义
抽象工厂模式(Abstract Factory Pattern)是提供一个创建一系列相关或相互依赖的产品(也可以说是同一产品族不同等级的产品)的接口,客户端不依赖于产品的具体实现细节,强调的是一起使用一系列的相关产品。所有的产品以同样的接口实现,从而使客户端不依赖于具体实现。
**注:**一系列产品的意思就是同一产品族,看完下面的代码示例中的宝马的发动机和logo就属于同一产品族,不同等级的产品意思不同的产品。
2.抽象工厂模式中的角色
**(1).抽象工厂(AbstractFactory):**提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
**(2).具体工厂(ConcreteFactory):**主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
(**3).抽象产品(Product):**定义了产品的规范,描述了产品的主要特性和功能。
**(4).具体产品(ConcreteProduct):**实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
3.具体实例
(1).场景:
一个汽车生产厂家,负责生产宝马车和奔驰车,车的组合肯定会有发动机和logo(这里就举例这两个),而且这两个是要一起使用才能组装成一辆完整的车,下面就以这两个产品来实现抽象工厂模式
(2).抽象工厂模式

package com.tw.designPattern.factory.abstractFactory;

/**
 * 抽象角色 发动机
 */
public interface Engine {

    void info();

}
package com.tw.designPattern.factory.abstractFactory;

/**
 * 具体角色 宝马发动机
 */
public class BMWEngine implements Engine{
    @Override
    public void info() {
        System.out.println("宝马发动机。");
    }
}

package com.tw.designPattern.factory.abstractFactory;

/**
 * 具体角色 奔驰发动机
 */
public class BenzEngine implements Engine{
    @Override
    public void info() {
        System.out.println("奔驰发动机。");
    }
}

package com.tw.designPattern.factory.abstractFactory;

/**
 * 抽象角色 logo
 */
public interface Logo {

    void info();
}

package com.tw.designPattern.factory.abstractFactory;

/**
 * 具体角色 宝马logo
 */
public class BMWLogo implements Logo{

    @Override
    public void info() {
        System.out.println("宝马车标。");
    }
}

package com.tw.designPattern.factory.abstractFactory;

/**
 * 具体角色 奔驰车标
 */
public class BenzLogo implements Logo{

    @Override
    public void info() {
        System.out.println("奔驰车标。");
    }
}

package com.tw.designPattern.factory.abstractFactory;

/**
 * 抽象角色 汽车工厂
 */
public interface CarFactory {

    /**
     * 生产发动机
     * @return
     */
    Engine productEngine();

    /**
     * 生产log
     * @return
     */
    Logo productLogo();
}

package com.tw.designPattern.factory.abstractFactory;

/**
 * 具体工厂 宝马工厂
 */
public class BMWFactory implements CarFactory{

    @Override
    public Engine productEngine() {
        return new BMWEngine();
    }

    @Override
    public Logo productLogo() {
        return new BMWLogo();
    }
}

package com.tw.designPattern.factory.abstractFactory;

/**
 * 具体工厂 奔驰工厂
 */
public class BenzFactory implements CarFactory{

    @Override
    public Engine productEngine() {
        return new BenzEngine();
    }

    @Override
    public Logo productLogo() {
        return new BenzLogo();
    }
}

package com.tw.designPattern.factory.abstractFactory;

public class FactoryTest {

    public static void main(String[] args) {
        // 创建宝马工厂
        BMWFactory bmwFactory = new BMWFactory();
        // 宝马发动机
        Engine bmwEngine = bmwFactory.productEngine();
        // 宝马车标
        Logo bmwLogo = bmwFactory.productLogo();
        bmwEngine.info();
        bmwLogo.info();
        // 创建奔驰工厂
        BenzFactory benzFactory = new BenzFactory();
        // 奔驰发动机
        Engine benzEngine = benzFactory.productEngine();
        // 奔驰车标
        Logo benzLogo = benzFactory.productLogo();
        benzEngine.info();
        benzLogo.info();

    }
}

测试结果:

宝马发动机。
宝马车标。
奔驰发动机。
奔驰车标。

下面会列举一下抽象工厂模式的优缺点和实际应用场景。
4.优缺点
(1).优点:
(1-1).抽象工厂模式创建用户所需的产品时,用户无需关心产品的创建细节,只需知道创建的产品所对应的工厂。
(2).缺点:
(2-1).定好了产品族种所有产品的集合,当新增产品的时候需要修改相应的工厂类方法,不符合开闭原则。
5.应用场景
(1).当需要创建同一产品族不同等级的产品的时候,用户不需要知道产品创建细节的时候,就比如汽车制造。
6.附上代码图片方便手机端查看
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
注:内容参考网络上各种资料,还有一些本人的理解和思想,仅为了学习记录和分享一下自己所学之处,如有不足的地方麻烦大牛指出,如有侵权的地方,请联系删除,谢谢。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值