JAVA常用設計模式(一、抽象工廠模式)


抽象工廠模式

抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他工廠。該超級工廠又稱為其他工廠的工廠。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。

在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。

意圖:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。

主要解決:主要解決接口選擇的問題。

何時使用:系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。

如何解決:在一個產品族里面,定義多個產品。

關鍵代碼:在一個工廠里聚合多個同類產品。

應用實例:下面例子中鼠標,鍵盤,耳麥為產品,惠普,戴爾為工廠,抽象工廠模式也就是不僅生產鼠標,同時生產鍵盤。也就是 PC 廠商是個父類,有生產鼠標,生產鍵盤兩個接口。戴爾工廠,惠普工廠繼承它,

     可以分別生產戴爾鼠標+戴爾鍵盤,和惠普鼠標+惠普鍵盤。創建工廠時,由戴爾工廠創建。后續工廠.生產鼠標()則生產戴爾鼠標,工廠.生產鍵盤()則生產戴爾鍵盤。

 

以下是具體實現代碼,首先是代碼結構圖:

import cn.review.day03.abstractfactory.product.Keboy;
import cn.review.day03.abstractfactory.product.Mouse;

/**
 * PC廠商工廠抽象類
 * @author dyq
 *
 */
public abstract class PcFactory {
    public abstract Mouse createMouse();
    public abstract Keboy createKeboy();
}
import cn.review.day03.abstractfactory.product.DellKeyboy;
import cn.review.day03.abstractfactory.product.DellMouse;
import cn.review.day03.abstractfactory.product.Keboy;
import cn.review.day03.abstractfactory.product.Mouse;
/**
 * 戴爾生產工廠
 * @author dyq
 *
 */
public class DellFactory extends PcFactory{

    @Override
    public Mouse createMouse() {
        return new DellMouse();
    }

    @Override
    public Keboy createKeboy() {
        return new DellKeyboy();
    }

}
import cn.review.day03.abstractfactory.product.HpKeboy;
import cn.review.day03.abstractfactory.product.HpMouse;
import cn.review.day03.abstractfactory.product.Keboy;
import cn.review.day03.abstractfactory.product.Mouse;
/**
 * 惠普生產工廠
 * @author dyq
 *
 */
public class HpFactory extends PcFactory{
    @Override
    public Mouse createMouse() {
        return new HpMouse();
    }
    @Override
    public Keboy createKeboy() {
        return new HpKeboy();
    }

}
/**
 * 生成工廠器類,通過不同的廠家來獲取不同的生產工廠
 * @author dyq
 *
 */
public class FactoryProducer {
    public static PcFactory getFactory(String choice){
          if(choice.equalsIgnoreCase("DELL")){
             return new DellFactory();
          } else if(choice.equalsIgnoreCase("HP")){
             return new HpFactory();
          }
          return null;
       }
}
/**
 * 產品之鼠標接口
 * @author dyq
 *
 */
public interface Mouse {
    public String sayHi();
}
/**
 * 產品之鍵盤接口
 * @author dyq
 *
 */
public interface Keboy {
    public String sayHi();
}
/**
 * 戴爾鍵盤生產類
 * @author dyq
 *
 */
public class DellKeyboy implements Keboy{
    @Override
    public String sayHi() {
        return "生產了戴爾鍵盤";
    }

}
/**
 * 戴爾鼠標生產類
 * @author dyq
 *
 */
public class DellMouse implements Mouse{

    @Override
    public String sayHi() {
        return "生產了戴爾鼠標";
    }

}
/**
 * 
 * @author dyq
 *
 */
public class HpKeboy implements Keboy{

    @Override
    public String sayHi() {
        return "生產了惠普鍵盤";
    }

}
public class HpMouse implements Mouse{

    @Override
    public String sayHi() {
        return "生產了惠普鼠標";
    }

}

最后是測試類:

import cn.review.day03.abstractfactory.factory.FactoryProducer;
import cn.review.day03.abstractfactory.factory.PcFactory;
import cn.review.day03.abstractfactory.product.Mouse;
/**
 * 測試抽象工廠模式
 * @author dyq
 *
 */
public class DesignPatternAbstractFactory {
    public static void main(String[] args) {
        PcFactory dellPcFactory = FactoryProducer.getFactory("DELL");
        Mouse dellMouse = dellPcFactory.createMouse();
        String mouse1 = dellMouse.sayHi();
        System.out.println(mouse1);
        
        
        PcFactory hpPcFactory = FactoryProducer.getFactory("HP");
        Mouse hpMouse = hpPcFactory.createMouse();
        String  mouse2 = hpMouse.sayHi();
        System.out.println(mouse2);
    }
}

 

在抽象工廠模式中,假設我們需要增加一個產品

假設我們增加耳麥這個產品,則首先我們需要增加耳麥這個父類,再加上戴爾耳麥,惠普耳麥這兩個子類。

之后在PC廠商這個父類中,增加生產耳麥的接口。最后在戴爾工廠,惠普工廠這兩個類中,分別實現生產戴爾耳麥,惠普耳麥的功能。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM