设计模式之简单工厂模式(4):创建对象时不会暴露创建逻辑

场景

我们创建商品

内容

1. 不使用工厂模式设计模式

使用传统new方式创建bean。

复制代码
public class NonPattern {
    public static void main(String[] args) {
        //1.我们使用传统方式创建产品
        Produnct produnct = new Produnct("苹果");
        System.out.println(produnct);
    }

    /**
     * 商品类
     */
    public static class Produnct{
        private String name;

        public Produnct(String name){
            this.name = name;
        }
       //setter getter省略
    }
}

2.使用工厂模式设计模式

2.1 逻辑
  1. 工厂模式创建的对象需要创建某一类产品,不是某一个产品,所以创建对象返回的对象是一个拥有共有特诊的接口。
  2. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
  3. 接口是从多个相似类中抽象出来的规范,接口体现了规范(设计)和实现分离的设计哲学,接口本身并不提供任何实现。
2.2 类图
2.3 代码
复制代码
public class FactoryPattern {
    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("产品:"+this.name);
        }
    }

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

         public void excute() {
           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();
        };
    }
}

3.总结

3.1 不使用设计模式对比
  1. 直接面向一个类来编程,new来创建类的实例的话,你就是后面会死的很惨;如果我们修改了产品类属性和构造器,那么通过new创建对象将会改变,如果系统通过new创建的对象很多,那么我们每一处都得改动。
  2. 我们如果对Product,要更换一个类,换一个类的实现;此时就必须在创建这个类实例的地方,都要修改一下这个代码;如果你有1000个地方,都创建了Product这个类的实例;你需要在1000个地方都去修改这个new Product()的这段代码;代码可维护性和可扩展性之差,惨不忍睹,垃圾代码
3.2 不使用设计模式对比
  1. 如果此时有1000个地方都需要获取Product的实例;但是此时Product实现类改了; 我们只要修改一个地方就是ProductFacory中:create()
  2. 但是此时客户端调用一直没变味。面向接口编程。
3.3 工厂模式自己的特点

**优点:**1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。

**缺点:**每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

相关推荐
Wang's Blog23 分钟前
Java 接入Redis: 五大数据类型与存储结构选型
java·服务器·redis
Wang's Blog27 分钟前
Java 接入Redis: 字符串与哈希类型操作命令
java·服务器·redis
智慧物业老杨5 小时前
物业数字化落地思考:真正的转型,是底层数据秩序的重构
java·大数据·人工智能·微服务·系统架构
星空7 小时前
金蝶苍穹build.gradle配置
java·build.gradle
步行cgn10 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
大帅点兵11 小时前
Apache Ant 1.9.9 完整讲解
java
LuTshoes11 小时前
spring ai 实战 手搓 PlaneExecuteAgent
java·人工智能·spring·ai
这料鬼有毒11 小时前
二刷hot100-73.矩阵置零
java
caoerzhong11 小时前
JeeWMS 开源仓库管理系统二次开发与接口对接实战:Java WMS 如何与 ERP、MES 和自动化设备打通
java·开源
长谷深风11111 小时前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent