您的位置:首页 > 其它

抽象工厂模式

2015-06-23 23:48 363 查看

什么是抽象工厂模式:

Provides an interface for creating families of related or dependent objects without specifying their concrete classes.


1.就是提供一个接口,这个接口的目的是创建对象。

2.创建什么样的对象?创建有族群关系的对象。

所谓的产品族群,是指位于不同产品等级结构中功能相关联的产品组成的家族

3.怎么创建?不通过制定具体的类型。



1.我们有一个抽象工厂接口:

AbstractFactory

所有的具体工厂都要通过实现这个接口来生产(创建)对象。

2.几个(两个)实现这个抽象工厂的具体工厂,工厂A、工厂B。

工厂A生成A系列的产品。

ConcreteFactoryA

工厂B生成B系列的产品。

ConcreteFactoryB

3.因为A、B不止单一的产品,他们各自有一族产品(产品A族,B族分别包括很多产品),所以这里有另个抽象的A、B产品定义。

AbstractProductA

AbstractProductB

4.客户端 只与 AbstractFactory、 AbstractProductB、AbstractProductA交互。并且客户端完全不知道实现类的存在,只在运行时决定获取哪个具体的工厂实现 去完成具体产品的创建。

也就是说,客户端完全与具体的实现解耦。另外一点,新的产品族也很灵活的被加入(易扩展)。怎么加入?通过去创建一个实现了抽象工厂的实现类(ConcreteFactoryC、ConcreteFactoryD…),并且相应的创建实现了抽象产品族(AbstractProductC、AbstractProductD…)的具体产品。



适用场景

当你要创建多个产品(对象)族或一系列的产品,但是不希望暴漏关于创建产品的实现细节。因为,客户端(调用者)与具体实现完全解耦。

代码示例

//Our AbstractProduct 
public interface Window {

    public void setTitle(String text);

    public void repaint();
}


//ConcreteProductA1
public class MSWindow implements Window
{
   public void setTitle()
  {
     //MS Windows specific behaviour 
  }


public void repaint()
  {
     //MS Windows specific behaviour 
  }
}


//ConcreteProductA2
public class MacOSXWindow implements Window
{
   public void setTitle()
  {
     //Mac OSX specific behaviour 
  }

   public void repaint()
  {
     //Mac OSX specific behaviour 
  }
}


//AbstractFactory
public interface AbstractWidgetFactory
{
   public Window createWindow();
}


//ConcreteFactory1
public class MsWindowsWidgetFactory implements AbstractWidgetFactory
{
   //create an MSWindow
   public Window createWindow()
   {
      MSWindow window = new MSWindow();   
      return window;
   }
}


//ConcreteFactory2
public class MacOSXWidgetFactory implements AbstractWidgetFactory
{
   //create a MacOSXWindow
   public Window createWindow()
   {
      MacOSXWindow window = new MacOSXWindow();   
      return window;
   }
}


//Client
public class GUIBuilder
{
   public void buildWindow(AbstractWidgetFactory widgetFactory)
   {
      Window window = widgetFactory.createWindow();   
      window.setTitle("New Window");
   }
}


public class Main{
   public static void main(String[] args)   
   {
     GUIBuilder builder = new GUIBuilder();
     AbstractWidgetFactory widgetFactory = null;
     //check what platform we're on 
     if(Platform.currentPlatform()=="MACOSX")
     {
        widgetFactory  = new MacOSXWidgetFactory();
     }
     else
     {
           widgetFactory  = new MsWindowsWidgetFactory();
     }
     builder.buildWindow(widgetFactory); 
    }
}




于是,我们在客户端就通过抽象的产品接口,获取具体的产品。

有没有发现一个问题?抽象工厂其实是借助具体工厂的手来动态的获取具体产品。那具体工厂就和客户端耦合了,难道不应该动态获取么?为什么要实例化?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: