天天看点

设计模式(四):Abstract Factory模式

Abstract Factory模式是对Factory Method模式的进一步演变。Factory Method所要解决的是new的问题。而Abstract Factory模式则试图为创建一系列产品提供统一的接口。当需要创建某一系列产品的时候,可以从抽象工厂中选择相应的系列创建一个具体的工厂类。

设计模式(四):Abstract Factory模式

OK,我们现在就来假设一个场景,比如需要一个GUI(图形用户界面),它既可以显示Windows风格的按钮,也可以显示OSX风格的按钮。这个时候我们就可以抽象出一个Button类,它作为WinButton和OSXButton的抽象基类,它们则代表着具体的“产品”。作为生产这些“产品”对应的工厂,WinFactory和OSXFactory则继承自一个AbstractFactory。这样,当客户端(Client)代码在创建相应的“产品”的时候,它并不知道具体“产品”,以及具体“工厂”的细节,和它打交道的都是接口或者抽象类。这很好体现了一个面向对象设计原则“针对接口编程,而不要针对实现编程”。(注:这里的接口并不是狭义的语言中的interface,它是指的广义的超类型(supertype) )

Java代码:

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

abstract   class  GUIFactory

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

... {

设计模式(四):Abstract Factory模式

    public static GUIFactory getFactory()

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

    ...{

设计模式(四):Abstract Factory模式

        int sys = readFromConfigFile("OS_TYPE");

设计模式(四):Abstract Factory模式

        if (sys == 0)

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

        ...{

设计模式(四):Abstract Factory模式

            return new WinFactory();

设计模式(四):Abstract Factory模式

        }

设计模式(四):Abstract Factory模式

        else

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

        ...{

设计模式(四):Abstract Factory模式

            return new OSXFactory();

设计模式(四):Abstract Factory模式

        }

设计模式(四):Abstract Factory模式

   }

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

   public abstract Button createButton();

设计模式(四):Abstract Factory模式

}

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

class  WinFactory  extends  GUIFactory

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

... {

设计模式(四):Abstract Factory模式

    public Button createButton()

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

    ...{

设计模式(四):Abstract Factory模式

        return new WinButton();

设计模式(四):Abstract Factory模式

    }

设计模式(四):Abstract Factory模式

}

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

class  OSXFactory  extends  GUIFactory

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

... {

设计模式(四):Abstract Factory模式

    public Button createButton()

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

    ...{

设计模式(四):Abstract Factory模式

        return new OSXButton();

设计模式(四):Abstract Factory模式

    }

设计模式(四):Abstract Factory模式

}

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

abstract   class  Button

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

... {

设计模式(四):Abstract Factory模式

    public abstract void paint();

设计模式(四):Abstract Factory模式

}

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

class  WinButton  extends  Button

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

... {

设计模式(四):Abstract Factory模式

    public void paint()

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

    ...{

设计模式(四):Abstract Factory模式

       System.out.println("I'm a WinButton: ");

设计模式(四):Abstract Factory模式

    }

设计模式(四):Abstract Factory模式

}

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

class  OSXButton  extends  Button

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

... {

设计模式(四):Abstract Factory模式

    public void paint()

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

    ...{

设计模式(四):Abstract Factory模式

       System.out.println("I'm a OSXButton: ");

设计模式(四):Abstract Factory模式

    }

设计模式(四):Abstract Factory模式

}

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

public   class  Application

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

... {

设计模式(四):Abstract Factory模式

    public static void main(String[] args)

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

    ...{

设计模式(四):Abstract Factory模式

        GUIFactory factory = GUIFactory.getFactory();

设计模式(四):Abstract Factory模式

        Button button = factory.createButton();

设计模式(四):Abstract Factory模式

        button.paint();

设计模式(四):Abstract Factory模式

    }

设计模式(四):Abstract Factory模式

    // Output is either:

设计模式(四):Abstract Factory模式

    //   "I'm a WinButton:"

设计模式(四):Abstract Factory模式

    // or:

设计模式(四):Abstract Factory模式

    //   "I'm a OSXButton:"

设计模式(四):Abstract Factory模式

}

设计模式(四):Abstract Factory模式

C#代码:

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

abstract   class  GUIFactory

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

... {

设计模式(四):Abstract Factory模式

    public static GUIFactory GetFactory()

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

    ...{

设计模式(四):Abstract Factory模式

        int sys = ReadFromConfigFile("OS_TYPE");

设计模式(四):Abstract Factory模式

        if (sys == 0)

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

        ...{

设计模式(四):Abstract Factory模式

            return new WinFactory();

设计模式(四):Abstract Factory模式

        }

设计模式(四):Abstract Factory模式

        else

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

        ...{

设计模式(四):Abstract Factory模式

            return new OSXFactory();

设计模式(四):Abstract Factory模式

        }

设计模式(四):Abstract Factory模式

   }

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

   public abstract Button CreateButton();

设计模式(四):Abstract Factory模式

}

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

class  WinFactory : GUIFactory

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

... {

设计模式(四):Abstract Factory模式

    public override Button CreateButton()

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

    ...{

设计模式(四):Abstract Factory模式

        return new WinButton();

设计模式(四):Abstract Factory模式

    }

设计模式(四):Abstract Factory模式

}

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

class  OSXFactory : GUIFactory

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

... {

设计模式(四):Abstract Factory模式

    public override Button CreateButton()

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

    ...{

设计模式(四):Abstract Factory模式

        return new OSXButton();

设计模式(四):Abstract Factory模式

    }

设计模式(四):Abstract Factory模式

}

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

abstract   class  Button

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

... {

设计模式(四):Abstract Factory模式

    public string Caption;

设计模式(四):Abstract Factory模式

    public abstract void Paint();

设计模式(四):Abstract Factory模式

}

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

class  WinButton : Button

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

... {

设计模式(四):Abstract Factory模式

    public override void Paint()

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

    ...{

设计模式(四):Abstract Factory模式

       Console.WriteLine("I'm a WinButton: " + Caption);

设计模式(四):Abstract Factory模式

    }

设计模式(四):Abstract Factory模式

}

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

class  OSXButton : Button

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

... {

设计模式(四):Abstract Factory模式

    public override void Paint()

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

    ...{

设计模式(四):Abstract Factory模式

       Console.WriteLine("I'm a OSXButton: " + Caption);

设计模式(四):Abstract Factory模式

    }

设计模式(四):Abstract Factory模式

}

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

class  Application

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

... {

设计模式(四):Abstract Factory模式

    static void Main()

设计模式(四):Abstract Factory模式
设计模式(四):Abstract Factory模式

    ...{

设计模式(四):Abstract Factory模式

        GUIFactory factory = GUIFactory.GetFactory();

设计模式(四):Abstract Factory模式

        Button button = factory.CreateButton();

设计模式(四):Abstract Factory模式

        button.Caption = "Play";

设计模式(四):Abstract Factory模式

        button.Paint();

设计模式(四):Abstract Factory模式

    }

设计模式(四):Abstract Factory模式

    // Output is either:

设计模式(四):Abstract Factory模式

    //   "I'm a WinButton: Play"

设计模式(四):Abstract Factory模式

    // or:

设计模式(四):Abstract Factory模式

    //   "I'm a OSXButton: Play"

设计模式(四):Abstract Factory模式

}

在分层架构中,DAO层(数据存取对象 Data Access Object)会根据具体情况采用Abstract Factory模式和Factory Method模式构建DAO层。

继续阅读