`
blues1021
  • 浏览: 139831 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

Abstract Factory抽象工厂模式-java设计模式2

uml 
阅读更多

一、概念:Abstract Factory是比Factory method更加抽象的一种模式,不是在factory也不是在子类中决定返回的子类,而是将这种判断交给的应用类。1.判断在应用类,返回创建类的子类 对象组对象。2.用对象组对象可以factory基类中声明的方法返回模型对象,模型对象可以返回不同的具体对象。
二、实例:创建一个园林的设计方案小程序,可以根据种植时间长短返回不同的种植方案,种植方案下可以返回不同的具体植物类型,程序的UML类图:


三、源代码解析:
3.1创建类的Garden接口:
package create.factory.abstractfactory;
public interface Garden {
    public Plant getShade();
    public Plant getCenter();
    public Plant getBorder();
}
只是声明了相关的方法。
3.2创建接口的多个子类:
package create.factory.abstractfactory;
public class VeggieGarden implements Garden {
    public Plant getShade() {
        return new Plant("Broccoli");
    }
    public Plant getCenter() {
        return new Plant("Corn");
    }
    public Plant getBorder() {
        return new Plant("Peas");
    }
}
只是实现了接口中定义的方法,返回实体模型类的不同对象(将对象实体创建)。其它两个类类似。
3.3对象实体模型类:
package create.factory.abstractfactory;
public class Plant {
    private String name;
    public Plant(String pname) {
        name = pname;     //save name
    }       
    public String getName() {
        return name;
    }
    }
3.4应用程序框架类:
package create.factory.abstractfactory;
import java.awt.*;
import java.awt.event.*;
//illustrates use of Abstract Factory pattern
public class Gardener extends Frame
implements ActionListener {
    private Checkbox Veggie, Annual, Peren; //单选框对象
    private Button Center, Border, Shade, Quit;
    private Garden garden = null; //使用了创建接口引用对象。
    private GardenPanel gardenPlot; //后面定义的显示具体对象的类。
    private String borderPlant = "", centerPlant = "", shadePlant = ""; //对应于具体对象
 public Gardener() {
        super("Garden planner"); //super时就是调用父类构造函数,此为Frame(String title);
        setGUI();
    }
    //----------------------------------
    private void setGUI() {
        setBackground(Color.lightGray); //getContentPane.setBackground(...)也就是Frame类设置背景色
        setLayout(new GridLayout(1,2));//使用了GridLayout,将Frame设置为(1,2)网格。
        Panel left = new Panel();
        add(left);                           //Frame.add(left);
        Panel right= new Panel();
        add(right);                               //Frame.add(right);
 //create label and 3 radio buttons on left side
        left.setLayout(new GridLayout(4, 1)); 
//再将 Panel类型的left设置(4,1)网格。
        left.add(new Label("Garden type"));//在网格中默认为从上到下,从左到右添加。
        CheckboxGroup grp= new CheckboxGroup();
        Veggie = new Checkbox("Vegetable", grp, false);
       
//设置Checkbox构造方法用CheckboxGroup初始化属性,所以为聚合关系。
        Annual = new Checkbox("Annual", grp, false);
        Peren = new Checkbox("Perennial", grp, false);
        left.add(Veggie); //通过聚合关系后拥有了特性,在用left.add Checkbox对象而不是CheckboxGroup对象。
        left.add(Annual);
        left.add(Peren);
        Veggie.addItemListener(new VeggieListener()); //为其添加监听器,从而决定返回那个对象组。
        Peren.addItemListener(new PerenListener());
        Annual.addItemListener(new AnnualListener());

        //now create right side
        right.setLayout(new GridLayout(2,1)); //
再将 Panel类型的right设置(2,1)网格。
        gardenPlot = new GardenPanel(); //后面显示具体对象的类,为其创建对象。
        gardenPlot.setBackground(Color.white);
        Panel botRight = new Panel();

        right.add(gardenPlot);//将显示具体对象类添加到right网格的第一行
        right.add(botRight); //将Button Panel面板放置到第二行
        Center = new Button("Central");
        Border =  new Button("Border");
        Shade = new Button("Shade");
        Quit = new Button("Quit");
        botRight.add(Center); //连续的添加button及它的监听器。
        Center.addActionListener(this);
        botRight.add(Border);
        Border.addActionListener(this);
        botRight.add(Shade);
        Shade.addActionListener(this);
        botRight.add(Quit);
        Quit.addActionListener(this);
        setBounds(200,200, 400,300);
        setVisible(true);

    }

    //----------------------------------
    public void actionPerformed(ActionEvent e) { 
//button类共同的默认监听器实现方法actionPerformed(),此处没有定义监听器类。
        Object obj = e.getSource();
        if (obj == Center)
            setCenter();
        if (obj == Border)
            setBorder();
        if (obj == Shade)
            setShade();
        if (obj == Quit)
            System.exit(0);
    }
    //----------------------------------
    private void setCenter() {//通过得到的返回子类对象组garden,调用getCenter返回Plant类型,getName返回String类型。
        if (garden != null) centerPlant = garden.getCenter().getName();
        gardenPlot.repaint();
    }
    private void setBorder() {
        if (garden != null) borderPlant = garden.getBorder().getName();
        gardenPlot.repaint();
    }
    private void setShade() {
        if (garden != null) shadePlant = garden.getShade().getName();
        gardenPlot.repaint();
    }
    private void clearPlants() {            //当用户切换到其他的对象组时,将具体对象清除,然后repaint 会调用paint方法生效。
        shadePlant=""; centerPlant=""; borderPlant = "";
        gardenPlot.repaint();
    }
    //----------------------------------
    static public void main(String argv[]) {
        new Gardener();
    }
//--------------------------------
    class GardenPanel extends Panel {
        public void paint (Graphics g) {
            Dimension sz=getSize();
            g.setColor(Color.lightGray);
            g.fillArc( 0, 0, 80, 80,0, 360);
            g.setColor(Color.black);
            g.drawRect(0,0, sz.width-1, sz.height-1);
            g.drawString(centerPlant, 100, 50);
            g.drawString( borderPlant, 75, 120);
            g.drawString(shadePlant, 10, 40);
        }
    }
    //-----------------------------
    class VeggieListener implements ItemListener {
        public void itemStateChanged(ItemEvent e) {
/*对于Checkbox类型,由关联关系,ItemListener是将ItemEvent消息标识和checkbox标识,传递给特定的ItemStateChange方法来处理的。*/
            garden = new VeggieGarden();
            clearPlants();
        }
    }
    //-----------------------------
    class PerenListener implements ItemListener {
        public void itemStateChanged(ItemEvent e) {
            garden = new PerennialGarden();
            clearPlants();
        }
    }
    //-----------------------------
    class AnnualListener implements ItemListener {
        public void itemStateChanged(ItemEvent e) {
            garden = new AnnualGarden();
            clearPlants();
        }
    }
}     //end of Gardener class
四、结论:
1.抽象工厂模式的一个主要目的是把所生成的具体类相分离,这些类的实际名称被隐藏在工厂中,客户不必了解。
2.修改类时,可以自由地修改或者交换这些产品类系列,不会导致系列间的相互影响。
3.添加类时,不可避免的会有额外不相同方法的类;此时:
(1)可以在基类中定义所有的方法(即使他们不一定有实际的功能)。
(2)派生一个新的基类,使之包含所需的全部方法,然后为所有的园林类型派生相应的子类。

分享到:
评论

相关推荐

    抽象工厂模式 - 代码(Java)

    抽象工厂模式是一种设计模式,属于创建型模式,它提供了一种创建对象集合的接口,而无需指定具体类。这种模式的关键在于,它允许在运行时创建一个产品家族,这些产品都属于同一类别,但可能有不同的实现。在Java中,...

    抽象工厂模式--演示代码

    抽象工厂模式是设计模式中的一种,属于创建型模式。它提供了一个创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“家族”这个概念,即一系列相关的对象,它们可以相互协作以完成特定任务。在Java中,...

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

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

    Java设计模式教程 - Java设计模式 - 抽象工厂模式

    抽象工厂模式是Java设计模式中的一种创建型模式,它提供了创建对象族的接口,而具体的对象族由子类决定。这种模式的主要目的是隔离接口与实现,使得客户端代码在更换产品族时无需修改,增强了软件的可扩展性和可维护...

    设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)

    设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)

    李建忠 C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式)

    **抽象工厂模式(Abstract Factory Pattern)是创建型设计模式之一,它提供了一种创建对象的接口,使得子类可以决定实例化哪一个类。这种类型的设计模式属于类的创建模式。** 在C#中,抽象工厂模式的核心在于抽象...

    设计模式之-抽象工厂-AbstractFactory

    总的来说,抽象工厂设计模式是一种强大的工具,它能够帮助我们构建更灵活、模块化的软件系统,同时隔离了对象创建的复杂性,使代码更加易于维护和扩展。在处理跨平台、多组件场景时,这种模式尤其有用。

    设计模式-抽象工厂-Java 源码

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而具体的对象族由子类决定。这种模式允许系统在不指定具体产品的前提下,能够创建一系列相关或相互依赖的对象,同时避免了硬编码所造成的...

    java设计模式-抽象工厂模式

    总的来说,抽象工厂模式在Java中是一种非常实用的设计模式,它可以帮助我们封装产品的创建过程,降低系统间的耦合度,同时提供了更好的可扩展性,使得添加新的产品族或者产品变得更加容易。在处理具有多种变体的复杂...

    AbstractFactory 抽象工厂

    抽象工厂(Abstract Factory)模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定它们的具体类。这种模式允许客户端在不关心具体实现的情况下,使用一组相关或相互依赖的对象。在Java或...

    设计模式之抽象工厂模式-c++

    抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,提供一个接口用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。这种模式常用于需要跨多个产品系列进行实例化的场景。 抽象工厂模式的...

    设计模式-抽象工厂模式javademo

    抽象工厂模式是软件设计模式中的一种创建型模式,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定它们的具体类。在Java编程中,抽象工厂模式通常用于实现跨平台或者跨框架的接口,使得系统...

    C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式) (Level 300)

    抽象工厂模式是面向对象设计模式中的创建型模式之一,它为创建一组相关或相互依赖的对象提供了一个统一的接口,使得客户端无需关注这些对象的具体实现细节。在C#中,抽象工厂模式的应用尤为广泛,尤其在多平台开发...

    2 抽象工厂模式-课程内容.rar

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定具体类。这种模式的主要优点在于它允许系统独立于如何创建、组合和表示产品的方式,提供了更高层次的抽象,使得更换产品族或...

    C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式)

    抽象工厂模式是面向对象设计模式中的一个创建型模式,它为创建一组相关或相互依赖的对象提供了一个接口,而无需指定它们的具体类。在C#中,这种模式的应用可以帮助我们实现跨平台、跨环境的代码,使得系统更具扩展性...

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

    在众多设计模式中,抽象工厂(Abstract Factory)模式是一种创建型模式,它为创建一组相关或相互依赖的对象提供一个接口,而无需指定它们的具体类。这种模式允许客户端使用抽象接口与具体实现解耦,使得系统更易于...

    工厂模式(简单工厂,普通工厂,抽象工厂)代码java

    - `AbstractFactory`文件很可能定义了一个抽象工厂接口以及实现了这个接口的具体工厂类。每个具体工厂类可以创建一系列相关的产品对象,形成一个产品族。 这些代码示例在`java`环境下实现,展示了如何利用工厂模式...

    java常用设计模式-抽象工厂模式

    java常用设计模式-抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口来创建对象,但将具体实现的决定留给子类来决定。在抽象工厂模式中,接口是负责创建...

    设计模式-抽象工厂模式(讲解及其实现代码)

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...

    设计模式 - 抽象工厂模式

    设计模式 - 抽象工厂模式 抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而不需要指定具体的类。该模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际...

Global site tag (gtag.js) - Google Analytics