深入理解23种设计模式(20) -- 抽象工厂模式

@[TOC]

介绍

  1. 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

在这里插入图片描述

  • AbstractFactory : 抽象工厂角色,它声明了一组用于创建一种产品的方法,每一个方法对应一种产品。

  • ConcreteFactory : 具体工厂角色,它实现了在抽象工厂中定义的创建产品的方法,生产一组具体产品,这饿产品构件成了一个产品种类,每一个产品都位于某个产品等级结构中。

  • AbstractProduct:抽象产品角色,为每种产品声明接口。

  • ConcreteProduct:具体产品角色,定义了工厂生产的具体产品对象,实现抽象产品接口声明的业务方法。

案例

发送机接口

//发动机
public interface Engine {

    void run();

    void start();
}

发动机实现类EngineA

public class EngineA implements Engine{

    @Override
    public void run() {
        System.out.println("转的快!");
    }

    @Override
    public void start() {
        System.out.println("启动快,自动档");
    }
}

发动机实现类EngineB

public class EngineB implements Engine{

    @Override
    public void run() {
        System.out.println("转的慢!");
    }

    @Override
    public void start() {
        System.out.println("启动快,手动档");
    }

}

座椅接口

//座椅
public interface Chair {

    void run();
}

座椅实现类ChairA

public class ChairA implements Chair{
    @Override
    public void run() {
        System.out.println("可以自动加热!");
    }
}

座椅实现类ChairB

public class ChairB implements Chair{
    @Override
    public void run() {
        System.out.println("不能加热!");
    }
}

汽车工厂

public interface CarFactory {

    // 创建发动机
    Engine createEngine();

    // 创建座椅
    Chair createChair();
}

汽车工厂实现类

public class JiLiFactory implements CarFactory {
    @Override
    public Engine createEngine() {

        return new EngineA();
    }

    @Override
    public Chair createChair() {

        return new ChairA();
    }
}

客户端

public class Client {

    public static void main(String[] args) {
        CarFactory carFactory=new JiLiFactory();
        Engine engine=carFactory.createEngine();
        engine.run();
        engine.start();

    }

}

在这里插入图片描述

优点和缺点

优点:

1)降低耦合:抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展;

2)更符合开-闭原则:新增一种产品类时,只需要增加相应的具体产品类和相应的工厂子类即可

缺点:

 1)抽象工厂模式的最大缺点就是产品族扩展非常困难

适用场景:

 1)  一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
 2)  这个系统有多个系列产品,而系统中只消费其中某一系列产品


github Demo地址 : ~~~传送门~~~

个人博客地址:http://blog.yanxiaolong.cn/

end
  • 作者:yxl(联系作者)
  • 发表时间:2021-02-24 18:04
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论