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

简单工厂模式是属于创建型模式,又叫做静态工厂方法(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、当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

 

posted @ 2022-05-10 19:24  青春岁月,无怨无悔  阅读(62)  评论(0编辑  收藏  举报