抽象工厂最容易理解的应用场景是主题,或者L&F(Look & Feel)。目前很多的application都支持不同的界面风格。当在不同的风格界面之间进行切换时,其内部包含的各种组件,如button、textview等等,也会切换到相应风格的组件。这种情况下,如果使用硬编码,则在程序中可能需要使用大量的条件判断,根据不同的界面风格,选择创建不同的组件。此时可以考虑使用抽象工厂来进行替换。
抽象工厂属于对象创建型模式,封装了对象的创建过程,提供一个/几个创建一系列相关/相互依赖对象的接口,而无需指定它们的具体类。示例如下:
//创建Button抽象接口
public interface Button {
public void draw();
}
//实现window平台下的Button类
public class WinButton implements Button {
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("Window Button");
}
}
//实现Unix平台下的Button类
public class UnixButton implements Button {
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("Unix Button");
}
}
//定义TextView抽象接口
public interface TextView {
public void draw();
}
//实现Windows平台下的TextView
public class WinTextView implements TextView {
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("Window TextView");
}
}
//实现Unix平台下的TextView
public class UnixTextView implements TextView {
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("Unix TextView");
}
}
//Windows平台下的工厂。对于每一个具体工厂,一般整个系统只需要一个工厂就可以,因此大部分的具体工厂都采用单例模式来实现,此处采用IoDH实现单例类
public class WinFactory implements Factory {
public static WinFactory getInstance(){
return HolderClass.mInstance;
}
private WinFactory(){
}
private static class HolderClass{
private static final WinFactory mInstance = new WinFactory();
}
@Override
public Button createButton() {
// TODO Auto-generated method stub
return new WinButton();
}
@Override
public TextView createTextView() {
// TODO Auto-generated method stub
return new WinTextView();
}
}
//Unix平台下的工厂,采用IoDH实现单例类 public class UnixFactory implements Factory { public static UnixFactory getInstance(){ return HolderClass.mInstance; } private UnixFactory(){ } private static class HolderClass{ private static final UnixFactory mInstance = new UnixFactory(); } @Override public Button createButton() { // TODO Auto-generated method stub return new UnixButton(); } @Override public TextView createTextView() { // TODO Auto-generated method stub return new UnixTextView(); } }
//客户端类 public class Client { private Factory mFactory = null; public Client(Factory factory){ mFactory = factory; } public void setFactory(Factory factory){ mFactory = factory; } public void layout(){ mFactory.createButton().draw(); mFactory.createTextView().draw(); } }
public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Client client = new Client(WinFactory.getInstance()); client.layout(); client.setFactory(UnixFactory.getInstance()); client.layout(); } }