`
Fis
  • 浏览: 86379 次
  • 性别: Icon_minigender_1
  • 来自: 龙城
社区版块
存档分类
最新评论

Design Pattern: Abstract Factory 模式

阅读更多
  假设您要制作一个对话方块(Dialog)元件,您希望的是这个对话方块可以有不同的视感(Look-and- feel),最基本的想法是,藉由Setter将不同视感的元件设定给这个对话方块,例如:
CustomDialog.java
    public class CustomDialog {
        private IButton button;
        private ITextField textField;
        public void setButton(IButton button) {
            this.button = button;
            }
            public void setTextField(ITextField textField) {
            this.textField = textField;
        }
        public void layoutAllComponents() {
            // ....
        }
        public void showDialog() {
            this.paintDialog();
            button.paintButton();
            textField.paintTextField();
        }
        public void paintDialog() {
            System.out.println("custom dialog paints....");
        }
    }

  很简单,这是最基本的介面依赖,Setter依赖于IButton与ITextField两个介面,而不是其实作类别,不过这边还有个进一步的要求,使用上面的方式还必须亲自呼叫Setter、layout等方法,您希望视感的更换可以更简单些,例如只要透一个元件的替换就可以完成对话方块上所有元件的视感更换。
  您可以使用Abstract Factory模式,将所有对话方块所需要的产生的元件加以封装,对话方块依赖于Abstract Factory,实际上具体的Factory实现则分别产生对话方块所需要的视感元件,下面的 UML 类别图展现这种概念。
abstractFactory-1.jpg



  现在如果要更换所有的视感元件,就只要抽象掉具体的Factory就可以了,例如:

CustomDialog windowsDialog =
      new CustomDialog(new WindowsWidgetFactory());
windowsDialog.showDialog();
              
CustomDialog macDialog =
      new CustomDialog(new MacWidgetFactory());
macDialog.showDialog();

  来将上面的UML图具体实现出来。
CustomDialog.java
    public class CustomDialog {
        private IButton button;
        private ITextField textField;
        public CustomDialog(IWidgetFactory widgetFactory) {
            setWidgetFactory(widgetFactory);
        }
        // 由于客户端只依赖于抽象的工厂,工厂如何实作并无关客户端的事
       // 要抽换工厂并不需要改动客户端的程式
       public void setWidgetFactory(IWidgetFactory widgetFactory) {
            setButton(widgetFactory.getButton());
            setTextField(widgetFactory.getTextField());
         }
        public void layoutAllComponents() {
            // layout all components
        }
        // 这边也是依赖抽象,实际改变了元件实例
       // 客户端代码也不用更改
       public void setButton(IButton button) {
            this.button = button;
        }
        public void setTextField(ITextField textField) {
            this.textField = textField;
        }
        public void showDialog() {
            this.paintDialog();
            button.paintButton();
            textField.paintTextField();
        }
        public void paintDialog() {
            System.out.println("custom dialog paints....");
        }
    } 

IButton.java
    public interface IButton {
        public void paintButton();
    } 

ITextField.java
    public interface ITextField {
        public void paintTextField();
    } 

IWidgetFactory.java
    public interface IWidgetFactory {
        public IButton getButton();
        public ITextField getTextField();
    } 

MacButton.java
    public class MacButton implements IButton {
        public void paintButton() {
            System.out.println("Mac button paints....");
        }
    } 

WindowsButton.java
    public class WindowsButton implements IButton {
        public void paintButton() {
            System.out.println("Windows button paints....");
        }
    } 

MacTextField.java
    public class MacTextField implements ITextField {
        public void paintTextField() {
            System.out.println("Mac textField paints....");
        }
    } 

WindowsTextField.java
    public class WindowsTextField implements ITextField {
        public void paintTextField() {
            System.out.println("Windows textField paints....");
        }
    } 


MacWidgetFactory.java
    public class MacWidgetFactory implements IWidgetFactory {
        public IButton getButton() {
            return new MacButton();
        }
        public ITextField getTextField() {
            return new MacTextField();
        }
    } 

WindowsWidgetFactory.java
    public class WindowsWidgetFactory implements IWidgetFactory {
        public IButton getButton() {
            return new WindowsButton();
        }
        public ITextField getTextField() {
            return new WindowsTextField();
        }
    }

  下图是Abstract Factory模式的UML结构图:
abstractFactory-2.jpg



  简单的说,在Abstract Factory模式中将具体的Product封装在具体Factory实现中,而客户仍只要面对Factory与Product的抽象介面,避免依赖于具体的Factory与Product,由于Factory封装了所必须的Product,所以要更换掉所有的元件,只要简单的抽换掉Factory就可以了,不用修改客户端的程式。

我的小结:Abstract Factory抽象工厂模式的用法是把窗体的具体部件和窗体分离开了,中间加入了工厂类,通过不同的工厂类来实现不改变窗体代码的情况下修改窗体的显示,只需设置不同的工厂类对象即可。
  • 大小: 34.5 KB
  • 大小: 26.9 KB
分享到:
评论

相关推荐

    DesignPattern:C#设计模式示例

    "DesignPattern:C#设计模式示例"这个资源很可能是包含多个C#实现的设计模式示例代码库。 设计模式通常分为三类:创建型、结构型和行为型。每种模式都解决了特定场景下的问题,并提供了良好的代码组织和扩展性。 ...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...

    DesignPattern::pencil:设计模式_java实现以及详解

    本资源“DesignPattern::pencil:设计模式_java实现以及详解”提供了一套详细的学习材料,帮助开发者理解和应用设计模式。 该资源的作者是“养码青年-Style”,他通过这个项目记录了自己的设计模式学习过程。鼓励...

    designpattern:java的设计模式

    pattern.p002.abstractfactory : 抽象工厂模式。 pattern.p003.singletonEH : 单例模式(饿汉式)。 pattern.p003.singletonLH : 单例模式(懒汉式)。 pattern.p003.singletonNew : 单例模式(完美解决方案)。 ...

    DesignPattern:设计模式小Demo

    设计模式是软件工程中的一种最佳实践,用于解决在软件设计中常见的...以上就是这个DesignPattern小Demo中可能会涵盖的设计模式,通过这些模式的实例,你可以更好地理解和应用它们到实际项目中,提升你的Java编程能力。

    DesignPattern:关于设计模式

    在这个“DesignPattern”仓库中,可能包含了对各种设计模式的详细解释、示例和应用。 设计模式分为三大类:创建型、结构型和行为型模式。创建型模式主要关注对象的创建过程,如单例模式(Singleton)、工厂模式...

    designpattern:PHP设计模式教程

    本教程的"designpattern-master"可能包含以上各种设计模式的实例代码和详细解释,帮助学习者通过实践掌握这些模式。在实际项目中,灵活运用这些设计模式可以提高代码质量,使项目更加健壮和易于维护。对于PHP开发者...

    DesignPattern:设计模式

    DesignPattern-master这个压缩包可能包含了一个关于设计模式的项目或者教程资源。 设计模式分为三类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式(Behavioral Patterns)...

    设计模式java源码-design-pattern:java设计模式源代码

    1. 创建型模式:这类模式涉及到对象的创建,如单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。这些模式提供了创建对象...

    designpattern:Head First 设计模式练习

    接着,工厂模式(Factory Method)用于创建对象,它提供了一个接口来创建对象,但让子类决定实例化哪一个类。Java中的抽象工厂类可能如下所示: ```java public abstract class ShapeFactory { public abstract ...

    设计模式源码Head_First_DesignPattern_src

    在`Head_First_DesignPattern_src`中,你可以找到`AbstractFactory`、`Product`和`ConcreteProduct`类,它们展示了简单工厂和抽象工厂模式的应用。 3. 观察者模式(Observer): 观察者模式定义了对象之间的一对多...

    designPattern:设计模式相关代码实现

    "designPattern:设计模式相关代码实现"这个项目,显然提供了不同设计模式在Java语言中的实际应用示例。 在Java世界里,设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。每种模式都针对特定的编程问题...

    design-pattern:标准设计模式的实施

    - 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而无需指定具体类。 - 建造者模式(Builder):将复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 - 原型...

    DesignPattern:设计模式演示程序

    这个名为"DesignPattern"的压缩包文件很可能包含了一个Java实现的各种设计模式的示例程序。 在这个"DesignPattern-master"目录中,我们可以期待找到一系列与设计模式相关的Java源代码文件(.java),每个文件或...

    DesignPattern:设计模式.net源代码

    本资源"DesignPattern:设计模式.net源代码"提供了一套基于.NET实现的设计模式示例,旨在帮助程序员更好地理解和应用这些模式。 在"DesignPattern-master"这个压缩包中,你可能找到的文件结构和内容包括: 1. **...

    design pattern tutorial

    2. 抽象工厂模式(Abstract Factory Pattern):提供一个接口用于创建相关或依赖对象的家族,无需指定具体类。它允许客户端使用抽象的接口来创建一组相关或相互依赖的对象。实现部分详细介绍了抽象工厂模式的结构和...

    JAVA design pattern-java设计模式

    创建型模式关注对象的创建,如单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。这些模式帮助我们控制实例化过程,使代码更具灵活性和可扩展性。 结构型模式涉及到如何组合类和对象...

    Design Pattern英文版

    - 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而无需指定具体类。 - 建造者模式(Builder):将复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示。 - 对象...

Global site tag (gtag.js) - Google Analytics