美文网首页
Java设计模式之工厂模式

Java设计模式之工厂模式

作者: singlezero | 来源:发表于2019-07-16 22:58 被阅读0次

    Java设计模式之工厂模式

    (本文是个人见解,如有问题请留言)

    简介

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

    代码示例

    假如我们需要设计一个电脑工厂,现在这个电脑工厂有两条流水线,一条是台式电脑,一条是服务器电脑,用户可以选择自己需要的主要配置,内存、CPU、显卡、硬盘再加上选择的类型工厂就能输出用户想要的电脑。

    • 首先我们建立电脑工厂的基类

      public abstract class BaseComputer {
      
          public abstract String getRAM();
      
          public abstract String getNvidia();
      
          public abstract String getHDD();
      
          public abstract String getCPU();
      
          @Override
          public String toString() {
              return "RAM= " + this.getRAM() + "NVIDIA=" + this.getNvidia() + ", HDD=" + this.getHDD() + ", CPU=" + this.getCPU();
          }
      }
      
    • 接着我们加入桌面电脑的流水线,

      public class DesktopComputer extends BaseComputer {
      
      
          private String ram;
          private String nvidia;
          private String hdd;
          private String cpu;
      
          public DesktopComputer(String ram, String nvidia, String hdd, String cpu) {
              this.ram = ram;
              this.nvidia = nvidia;
              this.hdd = hdd;
              this.cpu = cpu;
          }
      
      
          @Override
          public String getRAM() {
              return this.ram;
          }
      
          @Override
          public String getNvidia() {
              return this.nvidia;
          }
      
          @Override
          public String getHDD() {
              return this.hdd;
          }
      
          @Override
          public String getCPU() {
              return this.cpu;
          }
      }
      
      
    • 服务器级电脑

      public class ServerComputer extends BaseComputer {
      
      
          private String ram;
          private String nvidia;
          private String hdd;
          private String cpu;
      
          public ServerComputer(String ram, String nvidia, String hdd, String cpu) {
              this.ram = ram;
              this.nvidia = nvidia;
              this.hdd = hdd;
              this.cpu = cpu;
          }
      
      
          @Override
          public String getRAM() {
              return this.ram;
          }
      
          @Override
          public String getNvidia() {
              return this.nvidia;
          }
      
          @Override
          public String getHDD() {
              return this.hdd;
          }
      
          @Override
          public String getCPU() {
              return this.cpu;
          }
      }
      
    • 模拟工厂入口

      public class ComputerFactory {
      
          public static BaseComputer getBaseComputer(String type, String ram, String nvidia, String hdd, String cpu) {
      
              switch (type) {
                  case "DesktopComputer":
                      return new DesktopComputer(ram, nvidia, hdd, cpu);
                  case "ServerComputer":
                      return new ServerComputer(ram, nvidia, hdd, cpu);
                  default:
                      break;
              }
      
              return null;
          }
      }
      
    • 建立测试类

      public class TestFactory {
      
      
          public static void main(String[] args) {
              BaseComputer desktop = ComputerFactory.getBaseComputer("DesktopComputer", "16 GB", "gtx2060", "1 TB", "4.4 GHz");
              BaseComputer server = ComputerFactory.getBaseComputer("ServerComputer", "32 GB", "5700Tx", "1 TB", "4.9 GHz");
              System.out.println("Factory DesktopComputer Config::" + desktop);
              System.out.println("Factory ServerComputer Config::" + server);
          }
      }
      
    • 输出

      Factory DesktopComputer Config::RAM= 16 GBNVIDIA=gtx2060, HDD=1 TB, CPU=4.4 GHz
      Factory ServerComputer Config::RAM= 32 GBNVIDIA=5700Tx, HDD=1 TB, CPU=4.9 GHz
      

    总结

    工厂模式,定义了一个创建对象的接口,让其子类决定实例化那个类,工厂模式使其创建过程延迟到子类进行,解决了接口选择的问题,让我们明确的计划不同条件下创建不同实例,具体到代码上的优点,一个调用者想要创建一个对象只要知道他的名称就行了,扩展性高如果想要增加一个产品,只要扩展一个工厂类就行了,最后就是屏蔽了产品的具体实现,调用者只用关心产品的接口就行了。

    链接

    本文代码仓库地址:https://gitee.com/singlekingdom/JavaDesignPatterns.git
    

    相关文章

      网友评论

          本文标题:Java设计模式之工厂模式

          本文链接:https://www.haomeiwen.com/subject/tonxlctx.html