Abstract Factory概述

Abstract Factory - 图1

玩具代码案例 - GUI控件工厂

抽象工厂父类角色

IGUIFactory

  1. package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api;
  2. public interface IGUIFactory {
  3. IButton createButton();
  4. ICheckbox createCheckbox();
  5. IRadio createRadio();
  6. }

抽象产品组父类角色

IButton

  1. package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api;
  2. public interface IButton {
  3. void paint();
  4. }

ICheckbox

  1. package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api;
  2. public interface ICheckbox {
  3. void paint();
  4. }

IRadio

  1. package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api;
  2. public interface IRadio {
  3. void paint();
  4. }

抽象工厂子类角色&抽象产品组子类角色 - MacOSGUIFactory

MacOSGUIFactory

  1. package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.macos;
  2. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IButton;
  3. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.ICheckbox;
  4. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IGUIFactory;
  5. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IRadio;
  6. public class MacOSGUIFactory implements IGUIFactory {
  7. @Override
  8. public IButton createButton() {
  9. return new MacOSButton();
  10. }
  11. @Override
  12. public ICheckbox createCheckbox() {
  13. return new MacOSCheckbox();
  14. }
  15. @Override
  16. public IRadio createRadio() {
  17. return new MacOSRadio();
  18. }
  19. }

MacOSButton

  1. package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.macos;
  2. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IButton;
  3. public class MacOSButton implements IButton {
  4. @Override
  5. public void paint() {
  6. System.out.println("You have created MacOSButton.");
  7. }
  8. }

MacOSCheckbox

  1. package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.macos;
  2. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.ICheckbox;
  3. public class MacOSCheckbox implements ICheckbox {
  4. @Override
  5. public void paint() {
  6. System.out.println("You have created MacOSCheckbox.");
  7. }
  8. }

MacOSRadio

  1. package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.macos;
  2. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IRadio;
  3. public class MacOSRadio implements IRadio {
  4. @Override
  5. public void paint() {
  6. System.out.println("You have created MacOSRadio.");
  7. }
  8. }

抽象工厂子类角色&抽象产品组子类角色 - WindowsGUIFactory

WindowsGUIFactory

  1. package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.windows;
  2. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IButton;
  3. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.ICheckbox;
  4. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IGUIFactory;
  5. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IRadio;
  6. public class WindowsGUIFactory implements IGUIFactory {
  7. @Override
  8. public IButton createButton() {
  9. return new WindowsButton();
  10. }
  11. @Override
  12. public ICheckbox createCheckbox() {
  13. return new WindowsCheckbox();
  14. }
  15. @Override
  16. public IRadio createRadio() {
  17. return new WindowsRadio();
  18. }
  19. }

WindowsButton

  1. package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.windows;
  2. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IButton;
  3. public class WindowsButton implements IButton {
  4. @Override
  5. public void paint() {
  6. System.out.println("You have created WindowsButton.");
  7. }
  8. }

WindowsCheckbox

  1. package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.windows;
  2. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.ICheckbox;
  3. public class WindowsCheckbox implements ICheckbox {
  4. @Override
  5. public void paint() {
  6. System.out.println("You have created WindowsCheckbox.");
  7. }
  8. }

WindowsRadio

  1. package online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.windows;
  2. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IRadio;
  3. public class WindowsRadio implements IRadio {
  4. @Override
  5. public void paint() {
  6. System.out.println("You have created WindowsRadio.");
  7. }
  8. }

不基于抽象工厂模式的实现


创建产品的代码散布在系统的各个角落,一旦需要替换这组产品需要在各处修改代码

OS

  1. package online.javabook.gof.creational.patterns2.abstractfactory.widget.app.bad;
  2. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.macos.MacOSButton;
  3. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.macos.MacOSCheckbox;
  4. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.windows.WindowsButton;
  5. import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.windows.WindowsCheckbox;
  6. public class OS {
  7. private String osName;
  8. public String getOsName() {
  9. return osName;
  10. }
  11. public void setOsName(String osName) {
  12. this.osName = osName;
  13. }
  14. public void drawDesktop(){
  15. if(osName.equals("windows")) {
  16. new WindowsButton().paint();
  17. new WindowsCheckbox().paint();
  18. }
  19. else{
  20. new MacOSButton().paint();
  21. new MacOSCheckbox().paint();
  22. }
  23. }
  24. public void drawToolbar(){
  25. if(osName.equals("windows")) {
  26. new WindowsButton().paint();
  27. new WindowsCheckbox().paint();
  28. }
  29. else{
  30. new MacOSButton().paint();
  31. new MacOSCheckbox().paint();
  32. }
  33. }
  34. public void drawBrowser(){
  35. if(osName.equals("windows")) {
  36. new WindowsButton().paint();
  37. new WindowsCheckbox().paint();
  38. }
  39. else{
  40. new MacOSButton().paint();
  41. new MacOSCheckbox().paint();
  42. }
  43. }
  44. }

Main

  1. package online.javabook.gof.creational.patterns2.abstractfactory.widget.app.bad;
  2. public class Main {
  3. public static void main(String[] args) {
  4. String osName = System.getProperty("os.name").toLowerCase();
  5. // os
  6. OS os = new OS();
  7. os.setOsName(osName);
  8. // do business
  9. os.drawDesktop();
  10. os.drawToolbar();
  11. os.drawBrowser();
  12. }
  13. }

Console

  1. You have created MacOSButton.
  2. You have created MacOSCheckbox.
  3. You have created MacOSButton.
  4. You have created MacOSCheckbox.
  5. You have created MacOSButton.
  6. You have created MacOSCheckbox.

基于抽象工厂模式的实现

系统面向抽象的产品组件工作,一旦需要替换这组产品仅仅需要替换一个抽象工厂的实现即可

OS

package online.javabook.gof.creational.patterns2.abstractfactory.widget.app.good;

import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IGUIFactory;

public class OS {

    private IGUIFactory guiFactory;

    public IGUIFactory getGuiFactory() {
        return guiFactory;
    }

    public void setGuiFactory(IGUIFactory guiFactory) {
        this.guiFactory = guiFactory;
    }

    public void drawDesktop(){
        getGuiFactory().createButton().paint();
        getGuiFactory().createCheckbox().paint();
    }

    public void drawToolbar(){
        getGuiFactory().createButton().paint();
        getGuiFactory().createCheckbox().paint();
    }

    public void drawBrowser(){
        getGuiFactory().createButton().paint();
        getGuiFactory().createCheckbox().paint();
    }
}

Main

package online.javabook.gof.creational.patterns2.abstractfactory.widget.app.good;

import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.api.IGUIFactory;
import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.macos.MacOSGUIFactory;
import online.javabook.gof.creational.patterns2.abstractfactory.widget.product.impl.windows.WindowsGUIFactory;

public class Main {

    public static void main(String[] args) {

        // business
        String osName = System.getProperty("os.name").toLowerCase();

        // abstract factory
        IGUIFactory guiFactory;
        if (osName.contains("mac")) {
            guiFactory = new MacOSGUIFactory();
        } else {
            guiFactory = new WindowsGUIFactory();
        }

        // os -> gui factory
        OS os = new OS();
        os.setGuiFactory(guiFactory);

        // do business
        os.drawDesktop();
        os.drawToolbar();
        os.drawBrowser();
    }
}

Console

You have created MacOSButton.
You have created MacOSCheckbox.
You have created MacOSButton.
You have created MacOSCheckbox.
You have created MacOSButton.
You have created MacOSCheckbox.

UML

image.png