您的位置:首页 > 其它

23种设计模式——工厂模式

2020-03-05 00:12 183 查看

文章目录

工厂模式

工厂模式:(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

  • 核心本质

    实例化对象不用 new,用工厂方法代替。
  • 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
  • 三种模式:

      简单工厂模式 用来生产同一等级结构的任意产品。 (对于增加新的产品,需要覆盖已有代码)
  • 工厂方法模式
      用来生产同一等级结构中的固定产品。(支持增加任意产品)
  • 抽象工厂模式
      围绕一个超级工厂创建其他工厂。超级工厂又称为其他工厂的工厂。

    1. 简单工厂模式

    创建一个接口,

    public interface Car {
    public void name();
    }

    编写类实现接口,

    WuLing.class

    public class WuLing implements Car {
    @Override
    public void name() {
    System.out.println("五菱宏光");
    }
    }

    Tesla .class

    public class Tesla implements Car {
    @Override
    public void name() {
    System.out.println("特斯拉");
    }
    }

    编写调用类;

    public class Consumer {
    public static void main(String[] args) {
    WuLing wuLing=new WuLing();
    Tesla tesla = new Tesla();
    wuLing.name();
    tesla.name();
    }
    }

    以上是我们经常写的代码,没有用到工厂模式。

    改造

    添加一个工厂类(
    相当于中间商
    ),来实现实现类的初始化。

    public class CarFactory {
    public static Car getCar(String car) {
    
    if ("五菱".equals(car)) {
    return new WuLing();
    } else if ("特斯拉".equals(car)) {
    return new Tesla();
    } else return null;
    }
    }

    这时我们的调用者应该这样写

    public class Consumer {
    public static void main(String[] args) {
    Car wuling = CarFactory.getCar("五菱");
    Car tesla = CarFactory.getCar("特斯拉");
    
    wuling.name();
    tesla.name();
    }
    }

    这样就避免了new 实现了解耦。

    缺点
    缺点也很明显当我们想加一个功能时就要修改工厂类。

    如何解决这一问题呢?

    2.厂方法模式

    工厂方法模式的工厂是一个接口,然后每个实现了创建一个各自的工厂实现这个接口工厂。

    工厂接口

    public interface CarFactory {
    Car getCar();
    }

    五菱要有一个自己的工厂。

    WuLingFactory.class

    public class WuLingFactory implements CarFactory {
    @Override
    public Car getCar() {
    return new WuLing();
    }
    }

    特斯拉也要有一个自己的工厂。

    TeslaFactory.class

    public class TeslaFactory implements CarFactory {
    @Override
    public Car getCar() {
    return new Tesla();
    }
    }

    这时调用者代码

    public class Consumer {
    public static void main(String[] args) {
    
    Car tesla = new TeslaFactory().getCar();
    Car wuLing = new WuLingFactory().getCar();
    tesla.name();
    wuLing.name();
    }
    }

    这个好处为添加功能时不用修改代码。例如添加一台大众车。就只需要创建它的实现类和工厂就可以,不用修改工厂代码。

    大众实现类:

    public class DaZong {
    public void name() {
    System.out.println("大众");
    }
    }

    大众工厂z

    public class DaZongFactory implements CarFactory {
    @Override
    public Car getCar() {
    return new DaZong();
    }
    }

    在提供者中添加

    Car dazong = new DaZongFactory().getCar(); dazong.name();

    就可以实现。

    简单工厂和方法工厂对比

    • 结构复杂度: 简单工厂简单

    • 代码复杂度: 简单工厂简单

    • 编程复杂度: 简单工厂简单

    • 管理上的复杂度: 简单工厂简单

    • 根据设计原则: 工厂方法模式

    • 根据实际业务:简单工厂模式

    • 点赞
    • 收藏
    • 分享
    • 文章举报
    喝酸奶必舔瓶盖 发布了10 篇原创文章 · 获赞 0 · 访问量 206 私信 关注
  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: