抽象工廠模式(學習筆記)

  1. 意圖

  提供一個接口以提供一系列相關或相互依賴的對象,而無須知道指定它們的具體的類java

  2. 別名

  Kitapp

  3. 動機

  • 在軟件系統中常常面臨着一系列相互依賴的對象的建立工做;同時,因爲需求變化,每每存在更多系列對象的建立工做
  • 如何繞過常規的對象建立方法(new),提供一種封裝機制來避免客戶程序和這種多系列具體對象建立工做的緊耦合

  4. 適用性

  • 一個系統獨立於它的產品的建立、組合和表示
  • 一個系統要由多個產品系列中的一個配置
  • 要強調一系列相關產品對象的設計以便進行聯合使用
  • 提供一個產品類庫,可是隻想顯示接口而不是實現

  5. 結構

  

  6. 效果

  抽象工廠具備如下優勢和缺點:ide

  1) 分離了具體的類  客戶經過它們的抽象對象接口操縱實例。產品的類名也在具體工廠的實現中被隔離,即它們不出如今客戶代碼中ui

  2) 易於交換產品系列  抽象工廠建立了完整的產品系列,只須要改變具體工廠便可使用不一樣產品的配置spa

  3) 利於產品的統一性  當一個系列中的產品對象被設計成一塊兒工做時,一個應用一次只能使用同一系列中的對象設計

  4) 難以支持新種類的產品  抽象工廠接口肯定了能夠被建立的產品集合。支持新種類的產品就須要擴展該工廠接口,這將設計抽象工廠類及其子類的改變code

  7. 代碼實現

   buttons: 第一個產品層次結構 orm

Button.javaxml

package abstract_factory;

/**
 * @author GaoMing
 * @date 2021/7/17 - 15:37
 *
 */
public interface Button {
    void paint();
}

 MacOSButton.java對象

package abstract_factory;

/**
* @author GaoMing
* @date 2021/7/17 - 15:38
*/
public class MacOSButton implements Button{
@Override
public void paint(){
System.out.println("You have created MacOSButton.");
}
}

 WindowsButton.java

package abstract_factory;

/**
 * @author GaoMing
 * @date 2021/7/17 - 15:39
 */
public class WindowsButton implements Button{
    @Override
    public void paint(){
        System.out.println("You have created WindowButton.");
    }
}

Checkbox: 第二個產品結構

Checkbox.java

package abstract_factory;

/**
 * @author GaoMing
 * @date 2021/7/17 - 15:40
 */
public interface Checkbox {
    void paint();
}

 MacOSCheckbox.java

package abstract_factory;

/**
 * @author GaoMing
 * @date 2021/7/17 - 15:41
 */
public class MacOSCheckbox implements Checkbox{
    @Override
    public void paint(){
        System.out.println("You have created MacOSCheckbox.");
    }
}

 WindowsCheckbox.java

 
package abstract_factory;

/**
* @author GaoMing
* @date 2021/7/17 - 15:42
*/
public class WindowsCheckbox implements Checkbox{
@Override
public void paint(){
System.out.println("You have created WindowCheckbox.");
}
}

 Factories

GUIFactories.java: 抽象工廠

package abstract_factory.factories;
import abstract_factory.Button;
import abstract_factory.Checkbox;

/**
 * @author GaoMing
 * @date 2021/7/17 - 15:43
 */
public interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

MacOSFactory.java: 具體工廠 ( mac­OS)

package abstract_factory.factories;

import abstract_factory.Button;
import abstract_factory.Checkbox;
import abstract_factory.MacOSButton;
import abstract_factory.MacOSCheckbox;
/**
 * @author GaoMing
 * @date 2021/7/17 - 15:46
 */
public class MacOSFactory implements GUIFactory{
    @Override
    public Button createButton(){
        return new MacOSButton();
    }
    @Override
    public Checkbox createCheckbox(){
        return new MacOSCheckbox();
    }
}

WindowsFactory.java: 具體工廠 (Windows)

package abstract_factory.factories;

import abstract_factory.Button;
import abstract_factory.Checkbox;
import abstract_factory.WindowsButton;
import abstract_factory.WindowsCheckbox;
/**
 * @author GaoMing
 * @date 2021/7/17 - 15:49
 */
public class WindowsFactory implements GUIFactory{
    @Override
    public Button createButton(){
        return new WindowsButton();
    }

    @Override
    public Checkbox createCheckbox(){
        return new WindowsCheckbox();
    }

}

Application.java: 客戶端代碼

package abstract_factory;

import abstract_factory.Button;
import abstract_factory.Checkbox;
import abstract_factory.factories.GUIFactory;

/**
 * @author GaoMing
 * @date 2021/7/17 - 15:52
 */
public class Application {
    private Button button;
    private Checkbox checkbox;

    public Application(GUIFactory factory){
        button = factory.createButton();
        checkbox = factory.createCheckbox();
    }

    public void paint(){
        button.paint();
        checkbox.paint();
    }
}

Demo.java: 程序配置

package abstract_factory;

import abstract_factory.factories.GUIFactory;
import abstract_factory.factories.MacOSFactory;
import abstract_factory.factories.WindowsFactory;
import abstract_factory.Application;

import java.util.Locale;

/**
 * @author GaoMing
 * @date 2021/7/17 - 15:57
 */
public class Demo {
    private static Application configureApplication(){
        Application app;
        GUIFactory factory;
        String osName = System.getProperty("os.name").toLowerCase();
        if(osName.contains("mac")){
            factory = new MacOSFactory();
            app = new Application(factory);

        }else{
            factory = new WindowsFactory();
            app = new Application(factory);
        }
        return app;

    }
    public static void main(String[] args){
        Application app = configureApplication();
        app.paint();
    }
}

運行結果

You create WindowsButton.
You created WindowsCheckbox.

  

  8. 與其餘模式的關係

  • 一個應用中每一個產品系列只須要一個ConcreteFactory的實例。可用Singleton實現
  • 抽象工廠模式一般基於一組工廠方法, 但你也可使用原型模式來生成這些類的方法
  • Builder 重點關注如何分步生成複雜對象。 抽象工廠專門用於生產一系列相關對象。 抽象工廠會立刻返回產品, 生成器則容許你在獲取產品前執行一些額外構造步驟
  • 當只需對客戶端代碼隱藏子系統建立對象的方式時, 你可使用抽象工廠來代替外觀模式  

  9. 已知應用

  • javax.xml.parsers.DocumentBuilderFactory#newInstance()

  • javax.xml.transform.TransformerFactory#newInstance()

  • javax.xml.xpath.XPathFactory#newInstance()

相關文章
相關標籤/搜索