• 设计模式简单工厂模式


    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

      我们以打印不同银行的卡余额为例:

      在没有引用任何设计模式之前,代码示例如下:

      

    /** 农业银行业务类
     * @description:
     * @author: jack
     * @time: 2022/5/10 19:41
     */
    public class AbcBank {
    
       public void getBalance()
       {
           System.out.println("您的农业银行余额为1000元.");
       }
    }
    

      

    /** 建设银行业务类
     * @description:
     * @author: jack
     * @time: 2022/5/10 19:43
     */
    public class CcbBank {
    
        public void getBalance()
        {
            System.out.println("您的建设银行余额为2000元.");
        }
    
    }
    

      

    /**
     * @description: 简单工厂模式实现
     * @author: jack
     * @time: 2022/5/10 19:38
     */
    public class SimpleFactoryPatternDemo {
    
        public static void main(String[] args) {
            getBalance("ccb");
        }
    
        public static void getBalance(String bankName)
        {
              if("abc".equals(bankName)){
                  AbcBank abcBank = new AbcBank();
                  abcBank.getBalance();
              }
              else if("ccb".equals(bankName)){
                  CcbBank ccbBank = new CcbBank();
                  ccbBank.getBalance();
              }
        }
    }
    

      在这里我们可以看到,分别创建了AbcBank农业银行业务类、CcbBank建设银行业务类,以及具体main方法实现:

      执行getBalance("abc")方法,打印:您的农业银行余额为1000元.

      执行getBalance("ccb")方法,打印:您的建设银行余额为2000元.

      在使用简单工厂方法之后代码调整如下:

      首先我们抽象出银行类Bank.java

      

    /**
     * @description: 银行的抽象类
     * @author: jack
     * @time: 2022/5/10 20:00
     */
    public abstract class Bank {
        public abstract void getBalance();
    }
    

      农业银行和建设银行类分别集成银行基类

      

    /** 农业银行业务类
     * @description:
     * @author: jack
     * @time: 2022/5/10 19:41
     */
    public class AbcBank extends Bank{
    
        @Override
        public void getBalance() {
            System.out.println("您的农业银行余额为1000元.");
        }
    }
    

      

    /** 建设银行业务类
     * @description:
     * @author: jack
     * @time: 2022/5/10 19:43
     */
    public class CcbBank extends Bank{
    
        @Override
        public void getBalance() {
            System.out.println("您的建设银行余额为2000元.");
        }
    }
    

      我们把创建不同银行的实例交给银行工厂(静态)BankFactory

      

    /**
     * @description: 银行工厂
     * @author: jack
     * @time: 2022/5/10 19:59
     */
    public class BankFactory {
    
        /**
         * 根据不同参数创建不同银行业务类
         * @param bankName
         * @return
         */
         public static Bank createBank(String bankName)
         {
             Bank bank = null;
    
             switch (bankName) {
                 case "abc":
                      bank = new AbcBank();
                     break;
                 case "ccb":
                     bank = new CcbBank();
                     break;
             }
    
             return bank;
         }
    }
    

      下面我们根据不同的业务参数实现打印不同银行的余额:

      

    /**
     * @description: 简单工厂模式实现
     * @author: jack
     * @time: 2022/5/10 19:38
     */
    public class SimpleFactoryPatternDemo {
    
        public static void main(String[] args) {
    
            // 创建农行工厂,实现打印农业银行余额
            Bank abcBank =  BankFactory.createBank("abc");
            abcBank.getBalance();
    
            // 创建建行工厂,实现打印建设银行余额
            Bank ccbBank =  BankFactory.createBank("ccb");
            ccbBank.getBalance();
        }
    }
    

      打印结果:

      您的农业银行余额为1000元.

      您的建设银行余额为2000元.

      简单工厂的UML实例图:

      

      通过以上示例我们可以看出,在原有 if..else...的简单代码堆积的基础上进行了封装,把创建实例和业务实现进行分开,实例的创建交给工厂来创建

      使用简单工厂模式的优点和缺点

      优点:

      1、实现 ‘生产’ 和 ‘消费’ 完全分开

      2、对象的创建和使用相互分离,客户端不需要关心具体创建哪种实例,只需要传入参数工厂会自动创建对应的实例

      缺点:

      1、违背了开闭原则,当需要新加入实例时,需要修改工厂内部代码。

      2、由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。

      3、当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
  • 相关阅读:
    javascript DOM 操作
    遍历Map集合四中方法
    遍历List集合的三种方法
    Java中static关键字用法总结
    java中this关键字的作用
    深入理解Java的接口和抽象类
    MySQL查看所有用户及拥有权限
    MySQL新建用户,授权
    VMware Ubuntu如何连接互联网
    控件不接收用户交互的情况以及事件响应顺序
  • 原文地址:https://www.cnblogs.com/sunyj/p/16254940.html
Copyright © 2020-2023  润新知