解决实现依赖.[用Factory创建的对象,它的实现细节可能是不断变化的,但是它必须有一个稳定的接口]
Factory模式
利用给Factory对象传递不同的参数,以返回具有相同基类或实现了同一接口的对象。
Abstract Factory模式
先利用Factory模式返回具体Factory对象,在通过Factory对象返回不同的对象
那里变化,就封装那里.[变化点在对象创建]
new Road();Road 可能从泥泞路,到柏油大道,再到高速公路.
用factory 把 new Road 封装起来,当你的路升级了,你就只要改这一个地方.
如果没有变化,当然就不用封装了.
new String(); ?? 需呀封装吗?
面向接口编程,被创建的对象最好是某个Interface的实现.[这个interface是相对稳定的]
1,Factory模式同一个factory 创建实现一个interface的不同实现,客户端和Factory是松耦合的.
[应对对象实现不断发生变化的问题]
如: SAXParserFactory.
factoryImplName = System.getProperty("javax.xml.parsers.SAXParserFactory");
Class clazz = Class.forName(factoryImplName);
factoryImpl = (SAXParserFactory)clazz.newInstance();
根据运行时侯属性来决定用什么样的实例.
2,Abstract Factory模式,同一类interface由一个factory创建,客户端和Factory是耦合的.如下例.
[依赖只限于下图中红色的部分,应对多系列对象之间关系不断发生变化的问题,如下图producta 和productb有相互关系]
Abstract Factory模式定义了如何实例化一组对象系列,这些对象可能相关可能互为利用。客户在创建的时候无须指定这些对象属于什么类型,它只需关注是谁生产的。具体生产出来的一系列对象的细节和类别则由某个工厂负责。
使用范围
系统需要独立于组成它的对象系列的创建、组织和表现的时候
需要组合一系列的对象,这些对象作为整体作用于一个系统的时候
使用方法
考察抽象工厂的类图
AbstractFactory类是一个系统的抽象,称之为工厂,该工厂可能多个包含细节的子类。每个工厂都必须生产同一个系列的产品组,这里为AbstractProductA和AbstractProductB。然而,每一个工厂的系列产品又有不同的实现方法或表现方法。因此ConcreteFactory1生产ProductA1和ProductA2,ConcreteFactory2生产ProductB1和ProductB2。
举例说明
假设我们要在一个应用程序中创建一个Button和一个Textbox。对于不同的系统可能创建不一样的这两个对象,Linux下的和
Windows环境下的。
public abstract class Button {
protected abstract void createShape();
}
public abstract class Textbox {
protected abstract void createText();
}
在Linux环境下创建Button和Textbox的实现细节
public class LinuxButton extends Button{
protected void createShape() {
System.out.println("create Linux Button");
}
}
public class LinuxTextbox extends Textbox{
protected void createText() {
System.out.println("create
linux textbox");
}
}
在
Windows环境下创建Button和Textbox的实现细节
public class WindowsButton extends Button{
protected void createShape() {
System.out.println("create windows button");
}
}
public class WindowsTextbox extends Textbox{
protected void createText() {
System.out.println("create windows textbox");
}
}
这里是一个抽象工厂类,需要完成创建Button和Textbox的方法
public abstract class Factory {
Button button;
Textbox textbox;
public abstract void createButton();
public abstract void createTextbox();
}
Linux下的工厂角色
public class LinuxFactory extends Factory{
public void createButton() {
button = new LinuxButton();
button.createShape();
}
public void createTextbox() {
textbox = new LinuxTextbox();
textbox.createText();
}
}
Windows下的工厂角色
public class WindowsFactory extends Factory{
public void createButton() {
button = new WindowsButton();
button.createShape();
}
public void createTextbox() {
textbox = new WindowsTextbox();
textbox.createText();
}
}
到此为止,一个抽象工厂模式创建完毕。类结构图如下:
客户端的使用方法为:
public class Client {
public static void main(String args[]){
Factory factory = new LinuxFactory();
factory.createButton();
factory.createTextbox();
factory = new WindowsFactory();
factory.createButton();
factory.createTextbox();
}
}