原创

设计模式详解(二)--------工厂模式

一、关于工厂模式

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

总结:工厂模式用来创建实例对象。

工厂模式在一些需要生成复杂对象的情景下建议使用,但是简单的需求,特别是只需要new就创建对象的时候,其实是不建议去使用工厂模式的,我们在使用工厂模式的时候,必须要引入一个Factory类,这增加了系统的复杂度,所以工厂模式的选择,需要设计者自己去判断。

优点:1。程序获取对象的时候,不用再关心对象实现的过程,通过对象名可以直接获取到对象实例;2.提高了程序的扩展性,需要新增一个类的时候,直接扩展工厂类即可。

缺点:增加了系统的复杂度。

使用场景

1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。

2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。

3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。

二、实现

五种不同的计费方式背景下的工厂模式实现

1.创建FeeInterface.java接口(抽象产品)

/**
 * \* User: Baldwin
 * \* E_Mail: baldwin@chancellorhk.com || DikeyWang@163.com
 * \* Date: 2020/3/16
 * \* Time: 12:16
 * \* Description:
 * \
 */
public interface FeeInterface {

    String getToken();

    String reqFee();

}

接口中定义两个方法

2.分别创建三种计费封装类,并继承FeeInterface接口(具体产品)

import cn.yzstu.factory.fee.FeeInterface;

/**
 * \* User: Baldwin
 * \* E_Mail: baldwin@chancellorhk.com || DikeyWang@163.com
 * \* Date: 2020/3/16
 * \* Time: 12:18
 * \* Description:
 * \
 */
public class GzFee implements FeeInterface {

    public String getToken() {
        return "GzToken";
    }

    public String reqFee() {
        return "GzFee";
    }
}
import cn.yzstu.factory.fee.FeeInterface;

/**
 * \* User: Baldwin
 * \* E_Mail: baldwin@chancellorhk.com || DikeyWang@163.com
 * \* Date: 2020/3/16
 * \* Time: 12:19
 * \* Description:
 * \
 */
public class MelonFee implements FeeInterface {
    public String getToken() {
        return "MelonToken";
    }

    public String reqFee() {
        return "MelonFee";
    }
}
import cn.yzstu.factory.fee.FeeInterface;

/**
 * \* User: Baldwin
 * \* E_Mail: baldwin@chancellorhk.com || DikeyWang@163.com
 * \* Date: 2020/3/16
 * \* Time: 12:20
 * \* Description:
 * \
 */
public class BeiJingFee implements FeeInterface {
    public String getToken() {
        return "BeiJingoken";
    }

    public String reqFee() {
        return "BeiJingFee";
    }
}

3.创建FeeFactory工厂类(具体工厂)

import cn.yzstu.factory.fee.FeeInterface;
import cn.yzstu.factory.fee.impl.BeiJingFee;
import cn.yzstu.factory.fee.impl.GzFee;
import cn.yzstu.factory.fee.impl.MelonFee;

/**
 * \* User: Baldwin
 * \* E_Mail: baldwin@chancellorhk.com || DikeyWang@163.com
 * \* Date: 2020/3/16
 * \* Time: 12:02
 * \* Description:
 * \
 */
public class FeeFactory {
    public FeeInterface getFee(String feeName){
        if (feeName == null) return null;
        FeeInterface feeInterface;
        if ("gzfee".equals(feeName)) {
            feeInterface = new GzFee();
        } else if ("MelonFee".equals(feeName)) {
            feeInterface = new MelonFee();
        } else if ("BeiJing".equals(feeName)) {
            feeInterface = new BeiJingFee();
        }else {
            feeInterface = null;
        }
        return feeInterface;
        
    }
}

4.应用类(产品使用者)

import cn.yzstu.factory.fee.FeeInterface;


/**
 * \* User: Baldwin
 * \* E_Mail: baldwin@chancellorhk.com || DikeyWang@163.com
 * \* Date: 2020/3/16
 * \* Time: 12:31
 * \* Description:
 * \
 */
public class Demo {
    public static void main(String[] args) {
        FeeInterface fee = FeeFactory.getFee("BeiJing");
        System.out.println(fee.reqFee());
    }
    
}

5.运行结果

 

 

正文到此结束