可複用面向對象軟件基礎——設計模式(二)之工廠方法模式

一、工廠方法模式分類(3種)

  1. 普通工廠模式
  2. 多個工廠方法模式
  3. 靜態工廠方法模式

二、工廠方法模式詳解

(1)普通工廠模式

普通工廠模式就是建立一個工廠類,對實現了同一接口的一些進行實例的創建。

這裏寫圖片描述

// 1、創建不同產品的共同接口
public interface Sender {
    /**
     * 郵寄接口中有一個郵寄方法待實現
     */
    public void Send();
}
/**
 * 2、(實現類)郵件郵寄類實現了郵寄接口,實現其郵寄的抽象方法
 * @author barnett
 *
 */
public class MailSender implements Sender {

    @Override
    public void Send() {
        System.out.println("I am MailSender!");
    }
}
/**
 * 短信郵寄類實現了郵寄接口,實現其郵寄的抽象方法
 * @author barnett
 *
 */
public class SmsSender implements Sender {

    @Override
    public void Send() {
        System.out.println("I am SmsSender!");
    }
}
/**
 * 3、工廠類,負責多次製造產品(new出複用的類)
 * @author barnett
 *
 */
public class SendFactory {

    /**
     * 工廠類中的生產方法
     * @param type  輸入要生產的產品類型
     * @return  返回一個產品
     */
    public Sender produce(String type) {
        if("mail".equals(type)) {
            return new MailSender();
        } else if("sms".equals(type)) {
            return new SmsSender();
        } else {
            System.out.println("請輸入正確的類型!");
            return null;
        }
    }
}
/**
 * 4、測試類,實例一個工廠,生產多個產品
 * @author barnett
 *
 */
public class FactoryTest {

    public static void main(String[] args) {
        // 創建一個工廠(可多次生產)
        SendFactory factory = new SendFactory();
        // 使用工廠按照要求生產相應產品
        Sender sender = factory.produce("sms");
        // 調用產品的方法
        sender.Send();
        Sender sender2 = factory.produce("mail");
        sender2.Send();
    }
}

工廠優勢

1、 實例出一個工廠,再生產工廠內可以生產的產品,則只需要調用工廠的生產方法,通過傳入不同的參數,生產不同的產品
2、傳統方式則每次要生產一個產品時都需要實例化,然後調用生產方法
3、這樣一來,要生產產品時,無需瞭解內部細節,交由工廠管理,節省資源

(2)多個工廠方法模式

多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字符串出錯,則不能正確創建對象

而多個工廠方法模式是提供多個工廠方法,分別創建對象。

這裏寫圖片描述

/**
 * 工廠類,負責多次製造產品
 * @author barnett
 *
 */
public class MultiMethodSendFactory {

    /**
     * 專門生產郵件郵寄器的方法
     * @return
     */
    public Sender produceMail() {
        return new MailSender();
    }

    /**
     * 專門生產短信郵寄器的方法
     * @return
     */
    public Sender produceSms() {
        return new SmsSender();
    }
}
/**
 * 測試類,實例一個工廠,生產多個產品
 * @author barnett
 *
 */
public class MultiMethodFactoryTest {

    public static void main(String[] args) {
        // 創建一個工廠(可多次生產)
        MultiMethodSendFactory factory = new MultiMethodSendFactory();
        // 根據不同的需求調用不同的方法
        Sender mailSender = factory.produceMail();
        mailSender.Send();
        Sender smsSender = factory.produceSms();
        smsSender.Send();
    }
}

(3)靜態工廠方法模式

將上面的多個工廠方法模式裏的方法置爲靜態的,不需要創建實例直接調用即可。

/**
 * 工廠類,負責多次製造產品
 * @author barnett
 *
 */
public class StaticMethodSendFactory {

    /**
     * 專門生產郵件郵寄器的方法
     * @return
     */
    public static Sender produceMail() {
        return new MailSender();
    }

    /**
     * 專門生產短信郵寄器的方法
     * @return
     */
    public static Sender produceSms() {
        return new SmsSender();
    }
}
/**
 * 測試類,直接調用工廠中的靜態方法,生產產品
 * @author barnett
 *
 */
public class StaticMethodFactoryTest {

    public static void main(String[] args) {
        Sender mailSender = StaticMethodSendFactory.produceMail();
        mailSender.Send();
        Sender smsSender = StaticMethodSendFactory.produceSms();
        smsSender.Send();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章