设计模式之工厂方法模式(5):稍微复杂一点的工厂模式

场景

我们创建商品:苹果、橙子、每一个苹果橙子里面的都有相同的逻辑

内容

1.使用简单工厂模式

  1. 每一类商品都创建自己的工厂

  2. 每一类商品里面都封装:创建商品通用的逻辑和差异逻辑

  3. excute里面封装了通用和差异的逻辑

    public class NonPattern {
    public static void main(String[] args) {
    //1.创建苹果
    Product product1 = AppleProductFactory.create();
    product1.excute();
    //产品预处理:通用逻辑
    //产品:苹果

    复制代码
         //2.创建橙子
         Product product2 = OrangeProductFactory.create();
         product2.excute(); 
         //产品预处理:通用逻辑
         //产品:橙子
     }
    
    
    
     public interface Product{
         void excute();
     }
    
     public static class AppleProduct implements Product{
         private String name = "苹果";
         public void excute() {
             System.out.println("产品预处理:通用逻辑");
             System.out.println("产品:"+this.name);
         }
     }
    
     public static class OrangeProduct implements Product{
          private String name = "橙子";
    
          public void excute() {
              System.out.println("产品预处理:通用逻辑");
              System.out.println("产品:"+this.name);
          }
     }
    
     public static class AppleProductFactory{
       public static Product create(){
           return new AppleProduct();
       };
     }
    
     public static class OrangeProductFactory{
         public static   Product create(){
             return new OrangeProduct();
         };
     }

    }

2.使用工厂模板模式

2.1 类图
2.2 代码
复制代码
public class FactoryMethodPattern2 {
    public static void main(String[] args) {
        //1.创建苹果
        Product apple = AppleProductFactory.getInstance().create();
        apple.excute();
        /**
         * 输出:
         * 产品预处理:通用逻辑
         * 产品:苹果
         */

        //2.创建橙子
        Product orange = OrangeProductFactory.getInstance().create();
        orange.excute();
        /**
         * 输出:
         * 产品预处理:通用逻辑
         * 产品:橙子
         */
    }

//================================工厂============================
    public static abstract class AbstractProductFactory{
        public Product create(){
            commonExcute();
            return specialExcute();
        }

        public void commonExcute(){
            System.out.println("产品预处理:通用逻辑");
        }
        public abstract Product specialExcute();
    }

    public static class AppleProductFactory extends AbstractProductFactory{
        private static final AppleProductFactory instance = new AppleProductFactory();

        public static AppleProductFactory getInstance(){
            return instance;
        }
        public Product specialExcute() {
            return new AppleProduct();
        }
    }

    public static class OrangeProductFactory extends AbstractProductFactory{
        private static final OrangeProductFactory instance = new OrangeProductFactory();

        public static OrangeProductFactory getInstance(){
            return instance;
        }

        public Product specialExcute() {
            return new OrangeProduct();
        }
    }

//================================类============================
    public interface Product{
        void excute();
    }

    public static class AppleProduct implements Product{
        private String name = "苹果";
        public void excute() {
            System.out.println("产品:"+this.name);
        }
    }

    public static class OrangeProduct implements Product{
         private String name = "橙子";

         public void excute() {
             System.out.println("产品:"+this.name);
         }
    }
}

3.总结

3.1 不使用设计模式对比
  1. 问题跟模板方法模式的问题一模一样;就是多个工厂类中,有生产产品的相同的通用逻辑,没有抽取出来,直接复制粘贴放多个工厂里了;如果那段通用逻辑要修改;就需要很麻烦到所有工厂中去修改代码;可能会忘记修改某个工厂的代码.
3.2 不使用设计模式对比
  1. 这种设计模式算是较为复杂一点的工厂模式了;适用的是比较复杂的场景了; 一般就是需要多种工厂生产不同的产品, 但是产品都是类似的,同时不同的工厂有一定的相同逻辑; 那么就用这种模式。
相关推荐
OtIo TALL4 小时前
redis7 for windows的安装教程
java
uNke DEPH5 小时前
Spring Boot的项目结构
java·spring boot·后端
xixingzhe25 小时前
idea启动vue项目
java·vue.js·intellij-idea
jump_jump5 小时前
GetX — Flutter 的瑞士军刀,还是过度封装的陷阱?
flutter·设计模式·前端框架
wzl202612135 小时前
企业微信定时群发技术实现与实操指南(原生接口+工具落地)
java·运维·前端·企业微信
凌波粒5 小时前
Java 8 “新”特性详解:Lambda、函数式接口、Stream、Optional 与方法引用
java·开发语言·idea
曹牧6 小时前
Eclipse:悬停提示(Hover)
java·ide·eclipse
oyzz1206 小时前
Spring EL 表达式的简单介绍和使用
java·后端·spring
iNgs IMAC6 小时前
Redis之Redis事务
java·数据库·redis
程序员小假6 小时前
向量检索的流程是怎样的?Embedding 和 Rerank 各自的作用?
java·后端