设计模式之工厂方法模式(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. 这种设计模式算是较为复杂一点的工厂模式了;适用的是比较复杂的场景了; 一般就是需要多种工厂生产不同的产品, 但是产品都是类似的,同时不同的工厂有一定的相同逻辑; 那么就用这种模式。
相关推荐
chushiyunen4 分钟前
llama-index 数据清洗示例、数据清洗等
java·大数据·llama
zhangphil6 分钟前
Kotlin高阶函数作为参数与Java普通接口interface等效性
java·kotlin
2601_949818096 分钟前
记录 idea 启动 tomcat 控制台输出乱码问题解决
java·tomcat·intellij-idea
爱丽_7 分钟前
缓存一致性:Cache Aside、双删/延迟双删、穿透/击穿/雪崩与 CDC
java·spring·缓存
majingming1238 分钟前
接口的嵌入式实现
java·后端·spring
eEKI DAND9 分钟前
Spring Boot 3.3.4 升级导致 Logback 之前回滚策略配置不兼容问题解决
java·spring boot·logback
-Da-10 分钟前
【ai应用开发日记】通用未注入Bean AI提示词
java·数据库·人工智能·spring boot·sqlserver
黑马源码库miui5208611 分钟前
JAVA国际版同城上门服务上门送水桶装水配送源码同城上门配送系统源码支持Android+IOS+H5
android·java·ios
xdscode13 分钟前
Spring AI 中的 Flux 与 SSE:流式输出完全解析
java·flux·sse·springai·stream流式输出
星梦清河13 分钟前
Java并发编程
java·开发语言