现在的位置: 首页 > 综合 > 正文

设计模式之抽象工厂

2013年08月13日 ⁄ 综合 ⁄ 共 2436字 ⁄ 字号 评论关闭

    抽象工厂最容易理解的应用场景是主题,或者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();
	}

}









抱歉!评论已关闭.