码迷,mamicode.com
首页 > 其他好文 > 详细

抽象工厂模式

时间:2015-06-24 09:23:02      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:工厂模式   接口   设计模式   

什么是抽象工厂模式:

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); 
    }
}

技术分享

于是,我们在客户端就通过抽象的产品接口,获取具体的产品。
有没有发现一个问题?抽象工厂其实是借助具体工厂的手来动态的获取具体产品。那具体工厂就和客户端耦合了,难道不应该动态获取么?为什么要实例化?

抽象工厂模式

标签:工厂模式   接口   设计模式   

原文地址:http://blog.csdn.net/lemon89/article/details/46612323

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!