`
penciltim
  • 浏览: 43295 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

Abstract Factory 模式

阅读更多
假如你要制作一个对话框控件,你希望这个对话框可以有不同的Look&Feel,最基本的想法是,使用setter将不同的Look&Feel注入到这个对话框,例如:

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类图将展示这种概念。


现在如果要更换所有的控件,只需要注入具体的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.createButton());
        setTextField(widgetFactory.createTextField());
        // ....
    }

    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 createButton();
    public ITextField createTextField();
} 


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 createButton() {
        return new MacButton();
    }
    
    public ITextField createTextField() {
        return new MacTextField();
    }
} 


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


下图是Abstract Factory模式的UML结构图:

简单的说,在Abstract Factory模式中将具体的Product封装在Factory实现中,而库户仍只要面对Factory与Product的抽象界面,避免依赖于具体的Factory与Product,由于Factory封装了所有必须的Product,所以要更换所有的控件,只需要简单地替换掉Factory的具体实现就可以了,不需要修改客户端的程序。
  • 大小: 35.5 KB
  • 大小: 27.3 KB
分享到:
评论
1 楼 河蟹骑士 2009-03-30  
小MM,原文在哪里啊

相关推荐

    对设计模式—Abstract Factory模式的认识

    ### 设计模式——Abstract Factory模式的认识 在软件工程领域,设计模式是一种被广泛接受的解决方案,用于解决在软件设计过程中常见的问题。其中,Abstract Factory模式是23种GoF(Gang of Four)设计模式之一,它...

    设计模式之Abstract Factory模式和代码实现

    在设计模式中,Abstract Factory模式是一种用来解决在不指定具体实现的情况下创建一系列相关或相互依赖对象的模式。在本文的上下文中,我们看到它被应用于一个奇幻RPG游戏的角色种族设计,每个种族(如人类、精灵)...

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。

    AbstractFactory模式C++实现

    总的来说,AbstractFactory模式在C++中的实现充分利用了面向对象的特性,如抽象类、继承和多态,使得系统具有更好的灵活性和扩展性。通过这种方式,我们可以轻松地替换或增加新的产品族,而不会对原有代码造成太大的...

    设计模式 创建型模式 Abstract Factory模式(抽象工厂)

    Abstract Factory模式 1 定义创建对象的接口,并封装对象的创建 2 将具体化类的工作延迟到了类中 3 创建创建一组相关对象或者说是一组相互依赖的对象 一般情况下,我们为了提高内聚和松耦合,经常会使用多态来...

    AbstractFactory案例代码

    总结来说,“AbstractFactory案例代码”提供的是一种灵活的解决方案,它通过抽象工厂模式实现了数据访问层与具体数据库实现的解耦,使得在不同的数据库系统之间切换变得容易,同时保持了分层架构的清晰性和可维护性...

    创建型-抽象工厂模式(Abstract Factory)

    1. 抽象工厂(Abstract Factory):这是模式的核心,定义了一组创建对象的接口,客户端通过这个接口请求创建所需的产品。这个接口不直接创建产品,而是将产品创建的职责委托给具体工厂。 2. 具体工厂(Concrete ...

    C#设计模式之AbstractFactory

    在"小龙谈C#"系列中,讲解了如何在C#中应用Abstract Factory模式。通过这个系列,我们可以学习到以下关键知识点: 1. **抽象工厂接口**:这是模式的核心,它定义了一系列创建对象的方法,但不具体实现这些方法。...

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码 单最常用的设计模式入门,比如AbstractFactory模式、Adapater模式、Composite模式、Decorator模式、Factory模式、Observer模式、Strategy模式、Template模式等

    设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想...

    创建型模式之抽象工厂模式(Abstract Factory Pattern)

    1. 抽象工厂(Abstract Factory):这是模式的核心,它是一个接口或抽象类,定义了一系列创建对象的方法,但并不直接实例化具体的对象。这些方法用于创建一系列相关或相互依赖的对象。 2. 具体工厂(Concrete ...

    设计模式C++学习之抽象工厂模式(AbstractFactory)

    在这个例子中,`AbstractProductA`和`AbstractProductB`是抽象产品,`ConcreteProductA1/A2`和`ConcreteProductB1/B2`是具体产品,`AbstractFactory`是抽象工厂,`ConcreteFactory1/2`是具体工厂。客户端代码通过...

    java————23种设计模式-UML-类图及对应示例代码.doc

    * AbstractFactory:提供了创建一系列相关或相互依赖对象的接口。 * ConcreteFactory:实现了 AbstractFactory 接口,可以创建具体的产品对象。 * AbstractProduct:定义了产品对象的接口。 * ConcreteProduct:实现...

    abstractfactory delphi实现的例子

    Abstractfactory Factory模式对于对象的创建给予开发人员提供了很好的实现策略,但是Factory模式仅仅局限于一类类(就是说Product是一...AbstractFactory模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象

    23种设计模式整理pdf

    Abstract Factory 模式是一种创建型模式,用于提供一种创建对象的接口。Abstract Factory 模式的优点是可以提供一种统一的创建对象的接口,减少了代码的耦合度。Abstract Factory 模式的缺点是它可能会增加代码的...

    AbstractFactory设计模式源码

    在抽象工厂模式中,`AbstractFactory`接口定义了一系列用于创建产品的方法,`ConcreteFactory1`和`ConcreteFactory2`是`AbstractFactory`的实现,分别创建属于同一产品族的不同产品。`AbstractProductA`和`...

    抽象工厂模式abstractFactory

    public class WindowsFactory implements AbstractFactory { @Override public Button createButton() { return new WindowsButton(); } @Override public Window createWindow() { return new ...

    设计模式作业

    AbstractFactory模式解决了Factory模式在处理多个类族对象创建时的局限性,它允许开发者创建一组相关的工厂,每个工厂负责一类产品的创建,这样在增加新的产品族时,只需要添加新的工厂,而无需修改原有代码,符合...

    C++常见设计模式的解析和实现+源码解析.rar

    常见设计模式的解析和实现(C++)之二-Abstract Factory模式 常见设计模式的解析和实现(C++)之三-Builder模式 常见设计模式的解析和实现(C++)之四-Prototype模式 常见设计模式的解析和实现(C++)之五-Singleton模式 ......

    走进设计模式之抽象工厂(Abstract Factory)

    1. **模式结构**:抽象工厂模式通常包括抽象工厂接口(AbstractFactory),具体工厂类(ConcreteFactory),抽象产品接口(Product)以及具体产品类(ConcreteProduct)。抽象工厂定义了创建产品的方法,而具体工厂...

    C#设计模式之抽象工厂(abstract factory)模式示例源代码

    然后,根据不同的产品族,我们定义了具体的工厂类`PcFactory`和`MacFactory`,这两个类分别覆盖了`abstractFactory`中的`CreateRam`和`CreateCpu`方法,以返回对应产品族的具体产品实例。 最后,在客户端代码部分,...

Global site tag (gtag.js) - Google Analytics