java基础巩固-宇宙第一AiYWM:为了维持生计,工厂模式阅读总结Part1~整起

咱们从小学都已经学了:遇见生僻字,整个不认识但是看一半或许就能蒙对了。遇到不认识的此句,我管你是啥高端大气上档次的词句,先来一个见名识意,学基础、学设计模式、学框架,先蒙1秒钟-这是个啥玩意再学。

工厂模式【定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行】–用来生产东西的

  • 谁来生产
  • 怎样生产或者说用啥东西或者工具生产
  • 生产出来给谁用

比如我和我媳妇敏小言商量着赞一笔钱开一家西瓜厂卖西瓜,就借着星期日不上班在家合计着具体过程。
媳妇:老胡,你说生产西瓜,再没干过呀,这咋弄。
老胡:媳妇,最近不是流行外包嘛。咱们这样你看行不行咱把生产西瓜过程外包出去,给专门的西瓜大管家A去管,然后由这个西瓜大管家去帮咱们寻找不同的具体的生产西瓜的厂家,然后由这些厂家帮咱们生产西瓜。设计类图是这样。
java基础巩固-宇宙第一AiYWM:为了维持生计,工厂模式阅读总结Part1~整起_第1张图片

媳妇:哦,那是不是这样的,

  • 我这个西瓜大管家A相当于一个接口,里面定义着我西瓜管理、生产方面的一些抽象方法
    • 然后,由具体的不同的西瓜生产厂家去实现这个西瓜大管家A接口并重写接口中的抽象方法,然后利用这些方法去管理以及生产西瓜。

老胡:对嘞,然后由我去和西瓜大管家日常接触,然后向你直接汇报生意进展。设计类图如下:
java基础巩固-宇宙第一AiYWM:为了维持生计,工厂模式阅读总结Part1~整起_第2张图片

也就是说最后实际上是

AbstractXiGuaFactory shengXiGua = new XiGuaFactory();

然后,再由

shengXiGua.createXiGua(籽薄皮西瓜.class);
......
shengXiGua.createXiGua(无籽西瓜.class);
......

按照传进来的指定类型品牌的西瓜种子生产出具体的品牌西瓜。

我在抽象方法中使用了泛型的目的就是:为了安全,不亏本:

  • 限定了工厂只能生产我接收的的指定参数类型的XiGua类,也就是说你别想给咱们生产那些烂瓜

媳妇:那为什么不让西瓜大管家A直接帮咱们找具体的生产厂商一生产就完了,还要搞一个抽象类,然后里面放一个抽象的createXxx(…)方法,然后由这个抽象类的子类来帮咱们生产西瓜呢。
老虎:媳妇呀,这样一来,咱们就有如下的好处:

  • 少操点心,可以多歇会
  • 降低耦合性。如果之后咱们createXxx还有别的想法,那咱在搞一个其他的什么抽象类来让这个抽象类的子实现类帮咱们生产别的东西就行,咱们的西瓜产业不就不受影响了嘛
  • 至于找个大管家,那就是怕以后咱们西瓜品牌多了等,咱们让大管家帮咱们弄,咱们就不插手了。(作为一个生产的管理者,只需要知道生产什么就可以了而不需要知道西瓜等具体事物的具体详细信息,大小呀,颜色呀,重量呀等等,累死人。当时只需要告诉大管家或者就是(具体)工厂给我生产出一个某个品牌的西瓜,而具体多少籽、哪种籽啥颜色籽咱就不用管了

总而言之:java基础巩固-宇宙第一AiYWM:为了维持生计,工厂模式阅读总结Part1~整起_第3张图片

  • 工厂模式
    • 工厂模式一般配合策略模式一起使用。用来去优化大量的if...else...或switch...case...条件语句。比如优化excel导出的那个例子,下面图中不就是个工厂模式【定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行】嘛,
      java基础巩固-宇宙第一AiYWM:为了维持生计,工厂模式阅读总结Part1~整起_第4张图片
    • 使用工厂模式也必须**搞一个工厂接口,提供一个创建不同对象的方法**、其子类实现工厂接口,构造不同对象然后就可以使用工厂模式了
      • 搞一个工厂接口

        //搞一个工厂接口,提供一个创建不同对象的方法
        interface IFileResolveFactory{
           void resolve();
        }
        
      • 不同子类实现工厂接口

        class AFileResolve implements IFileResolveFactory{
           void resolve(){
              System.out.println("文件A类型解析");
           }
        }
        
        class BFileResolve implements IFileResolveFactory{
           void resolve(){
              System.out.println("文件B类型解析");
           }
        }
        
        class DefaultFileResolve implements IFileResolveFactory{
           void resolve(){
              System.out.println("默认文件类型解析");
           }
        }
        
      • 使用的话就是:

        ...
        //构造不同的工厂对象
        IFileResolveFactory fileResolveFactory;
        if(fileType=A){
            fileResolveFactory = new AFileResolve();
        }else if(fileType=B){
            fileResolveFactory = new BFileResolve();
         }else{
            fileResolveFactory = new DefaultFileResolve();
        }
        
        fileResolveFactory.resolve();
        ...
        
    • 工厂模式用于创建对象,NIO 中大量用到了工厂模式,比如 Files 类的 newInputStream 方法用于创建 InputStream 对象(静态工厂)、 Paths 类的 get 方法创建 Path 对象(静态工厂)、ZipFileSystem 类(sun.nio包下的类,属于 java.nio 相关的一些内部实现)的 getPath 的方法创建 Path 对象(简单工厂)
      • InputStream is Files.newInputStream(Paths.get(generatorLogoPath))

巨人的肩膀:
设计模式之禅
Head First 设计模式
spring揭秘
JavaGuide

你可能感兴趣的:(设计模式~学了个学,java,简单工厂模式,工厂方法模式)