设计模式之工厂方法模式(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. 这种设计模式算是较为复杂一点的工厂模式了;适用的是比较复杂的场景了; 一般就是需要多种工厂生产不同的产品, 但是产品都是类似的,同时不同的工厂有一定的相同逻辑; 那么就用这种模式。
相关推荐
禾高网络11 分钟前
开启环保新潮流:回收小程序系统功能介绍
java·大数据·小程序
deviant-ART14 分钟前
java stream 的 findFirst 及 findAny 方法遇到 null 元素时会出现 NullPointerException
java·开发语言
董员外1 小时前
RAG 系统进化论(九):RAG 评测,怎样证明系统真的变好了?
人工智能·设计模式·程序员
jjjava2.01 小时前
MyBatis动态if/trim/where/set标签详解
java·开发语言·数据库
gugucoding1 小时前
34.【Java】I/O流(下):NIO与文件操作
java·python·nio
tianyu2341 小时前
双指针循环匹配金额——打款记录与账单的自动对账算法
java·算法·双指针循环·匹配金额
YDS8292 小时前
大营销平台 —— 架构解析和抽奖流程串联
java·springboot·ddd
小贤plus2 小时前
MyBatis‑Plus IPage 分页踩坑实战:分页与全量查询兼容方案
java
西安小哥2 小时前
AI时代技术工程师的"道法术器势":学习图谱、成长规划与角色重塑
人工智能·设计模式·程序员
Java内核笔记2 小时前
BeanRegistrar:Spring Boot 4 最被低估的新特性,彻底改变 Bean 注册方式
java·后端