首页 > 其他分享 >设计模式--简单工厂方法

设计模式--简单工厂方法

时间:2022-09-01 23:45:20浏览次数:69  
标签:product display -- 创建 Product 工厂 设计模式 public

简介

简单工厂模式属于创建型模式,是工厂模式的一种。简单工厂模式通过定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类,这个父类具有共有的属性和方法。因在简单工厂模式中用于创建实例的方法通常是静态方法,因此也称为静态工厂方法模式

  • Product 表示产品接口,也可用抽象类实现,封装产品间共有的属性

  • ProductA、ProductB 表示具体的实际产品

  • Factory 表示工厂,工厂根据需要来创建相应的产品

这样一来,当添加新的 ProductC 时,只需要修改工厂部分代码即可,而传统方法需要在每一个创建产品的地方都进行修改


实现

  • 产品接口
    • public interface Product {
          void display();
      }
  • 产品接口实现子类
    • 产品A类

      public class ProductA implements Product {
      
          @Override
          public void display() {
              System.out.println("This is product A");
          }
      }
    •  产品B类
      public class ProductB implements Product {
      
          @Override
          public void display() {
              System.out.println("This is product B");
          }
      }
  •  简单工厂类
    • public class Factory {
      
          /**
           * 方式一:根据名称创建具体的日志记录器
           * @param type
           * @return
           */
          public static Product createProductByType(String type){
      
              Product product = null;
              if ("ProductA".equals(type)) {
                  product = new ProductA();
              } else if ("ProductB".equals(type)) {
                  product = new ProductB();
              }
      
              return product;
          }
      
          /**
           * 通过反射创建日志记录器
           * @param cls
           * @return
           */
          public static Product createProductByClass(Class cls){
      
              Product product = null;
              try {
                  product = (Product) Class.forName(cls.getName()).newInstance();
              } catch (InstantiationException e) {
                  e.printStackTrace();
              } catch (IllegalAccessException e) {
                  e.printStackTrace();
              } catch (ClassNotFoundException e) {
                  e.printStackTrace();
              }
      
              return product;
          }
      }
  • 测试
    • public class Test {
          public static void main(String[] args) {
      
              Product productA = Factory.createProductByType("ProductA");
              Product productB = Factory.createProductByType("ProductB");
              productA.display();
              productB.display();
      
              System.out.println("----------------------------------------");
      
              productA = Factory.createProductByClass(productA.getClass());
              productB = Factory.createProductByClass(productB.getClass());
              productA.display();
              productB.display();
          }
      }
      This is product A
      This is product B
      ----------------------------------------
      This is product A
      This is product B

优势和缺点

优势

  • 将创建实例与使用实例分开,使用者不必关心类对象创建细节,实现了解耦

缺点

  • 违背开闭原则,一旦添加新产品就得修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂
  • 由于使用了静态方法,静态方法不能被继承和重写,会造成工厂类无法继承

应用场景

  • 工厂类负责创建的产品对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂
  • 客户端对于如何创建对象细节不关心:客户端不需要关心创建细节,只需要传输所对应的参数即可

标签:product,display,--,创建,Product,工厂,设计模式,public
From: https://www.cnblogs.com/52-IT-y/p/16648243.html

相关文章

  • 19删除链表的倒数第N个节点
    题目19删除链表的倒数第N个节点给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=......
  • JS中==和===的区别
    ==和===的区别使用双等号进行相等判断时,如果两边的类型不一致,则会进行强制类型转化后再进行比较;使用三等号进行相等判断时,如果两边的类型不一致时,不会做强制类型准换,直......
  • SSM项目启动Tomcat失败
    1、Tomcat无法运行起来我的情况是配置好Tomcat后tomcat没有闪退但是tomcat启动不起来,当时用的是Tomcat10解决方法是把下面这段代码注释掉就能启动了<!--乱码过滤-->......
  • 2022 HDU多校8
    Theramore(思维)Problem给定一个01串,可以进行无限次操作,每次操作可以把一个长度为奇数的区间翻转,问可以得到的字典序最小的01串是多少Solvehit1:反转后奇数位置还是在......
  • 【Django】第03回 生命周期、路由匹配、反向解析、名称空间
    目录1.用户数据的增删改查2.Django请求生命周期流程图3.路由匹配3.1path斜杠3.2path转换器3.3正则匹配无名分组、有名分组4.反向解析4.1反向解析语法4.2无名有名......
  • Markdown基础语法
    1.标题n个#+空格+标题名字=n级标题使用#表示标题,#号数量对应标题级数,最多六级标题。#一级标题##二级标题###三级标题####四级标题#####五级标......
  • C++左值、右值引用
    概念左值与右值是相对于赋值运算符(=)与累加运算符(+=),以下内容统称为运算符。左值:存放于运算符左边的值,凡是能取地址(&)都是左值。右值:存放于运算符右边的值,不能取地址(&)都是......
  • 数据预处理
    data.xlsx数据如下1#-*-coding:utf-8-*-2#我们必须进行数据预处理它直接关系到分析结果的准确性处理缺失值数据重复值3#检查缺失值检测缺失值最简单......
  • 新机器(禁止上网)安装vscode及公钥方式登陆linux
    1.1 新机器(禁止上网)安装vscode注意:以下三个程序版本必须一至。1) vscodeWin10安装程序2) win10插件(ssh客户端)3) linux里vscode-server-linux-x64.tar.gz(ssh服......
  • 08.回收活动、活动的启动模式
    1、回收活动当一个活动进入了停止状态后,是有可能会被系统回收的。如果遇到以下场景:用户在使用一个APP,在活动A的基础上启动了活动B,活动A这时就进入了停止状态,这个时候由于......