码迷,mamicode.com
首页 > 编程语言 > 详细

Java与设计模式-抽象工厂模式

时间:2016-03-07 20:59:25      阅读:303      评论:0      收藏:0      [点我收藏+]

标签:

    首先说明,文章较长,保证你有耐心看完肯定能懂,没耐心直接点×即可。

    抽象工厂模式,是创建型设计模式之一。抽象型工厂模式适合产品确定,产品线不确定的类型,怎么讲?通过一个具体例子来讲一下吧。例如某电脑厂商要生产电脑,也就是电脑这个产品确定,而电脑配置不确定,这种情况可以用抽象工厂模式来解决。类图如图所示:

技术分享


代码实现完全结合UML类图,结合图就可以完成系统创建。

本实例里是抽象类ComputerFactory(对应UML类图中的AbstractFactory):

package com.factory.demo;

public abstract class ComputerFactory {
	public abstract CPU createCPU();
	public abstract MainBoard createMainBoard();
	public abstract RAM createRAM();

}
有三个方法,生产CPU,生产主板和生产内存。

产品抽象接口,CPU(对应UML类图中的ProductA):

package com.factory.demo;

public interface CPU {

	void cpu();
}
产品抽象接口,主板(对应UML类图中的ProductB):

package com.factory.demo;

public interface MainBoard  {
	 void mainboard(); 
}
产品抽象接口,内存((对应UML类图中的ProductC)):

package com.factory.demo;

public interface RAM {

	void ram();
}

下面是具体产品,CPU的I3(对应UML类图中的ProductA1):

package com.factory.demo;

public class I3CPU implements CPU {

	public void cpu() {
		System.out.println("i3处理器");

	}

}
具体产品,CPU的I5(对应UML类图中的ProductA2):
package com.factory.demo;

public class I5CPU implements CPU {

	public void cpu() {
		System.out.println("i5处理器");

	}

}

具体产品,主板 联想主板(对应UML类图中的ProductB1):

package com.factory.demo;

public class LenovoMainBoard implements MainBoard {

	@Override
	public void mainboard() {
		System.out.println("华硕主板");

	}

}

具体产品,主板 华硕主板(对应UML类图中的ProductB2):

package com.factory.demo;

public class ASUSMainBoard implements MainBoard {

	@Override
	public void mainboard() {
		System.out.println("联想主板");

	}

}
具体产品 内存 三星内存(对应UML类图中的ProductC1):

package com.factory.demo;

public class SamsungRAM implements RAM {

	public void ram() {
		System.out.println("三星内存");

	}

}
具体产品,内存 金士顿内存(对应UML类图中的ProductC2):

package com.factory.demo;

public class KingStoneRAM implements RAM {

	public void ram() {
		System.out.println("金士顿内存");

	}

}

具体工厂类1,Computer1继承抽象工厂类(对应UML类图中的Factory1):

package com.factory.demo;

public class Computer1 extends ComputerFactory {
	/**
	 * 组装电脑1,用的i3处理器、联想的主板和三星的内存
	 * @return
	 */

	@Override
	public CPU createCPU() {
		return new I3CPU();
	}

	@Override
	public MainBoard createMainBoard() {
		return new LenovoMainBoard();
	}

	@Override
	public RAM createRAM() {
		return new SamsungRAM();
	}



}

具体工厂类2,Computer2继承抽象工厂类(对应UML类图中的Factory2):

package com.factory.demo;

public class Computer2 extends ComputerFactory {
	/**
	 * 组装电脑2,用的i5处理器、华硕的主板和金士顿的内存
	 * @return
	 */

	@Override
	public CPU createCPU() {
		return new I5CPU();
	}

	@Override
	public MainBoard createMainBoard() {
		return new ASUSMainBoard();
	}

	@Override
	public RAM createRAM() {
		return new KingStoneRAM();
	}


}

这时创建一个测试类:

package com.factory.demo;

public class TestFactory {

	public static void main(String[] args) {
		//电脑1
		ComputerFactory computer1=new Computer1();
		System.out.println("组装产品类型1:");
		computer1.createCPU().cpu();
		computer1.createMainBoard().mainboard();
		computer1.createRAM().ram();
		
		//电脑2
		ComputerFactory computer2=new Computer2();
		System.out.println("组装产品类型2:");
		computer2.createCPU().cpu();
		computer2.createMainBoard().mainboard();
		computer2.createRAM().ram();
		
	

	}

}

运行测试类:

技术分享

总结一下:上面每一个类或接口都对应了UML类图中的每一个元素,可以参照UML类图构建系统。本系统好处是分离了接口和实现,实现产品下种类切换时十分灵活容易(也就是再制作一条产品Computer3的生产线很容易)。缺点也是显而易见,会造成类爆炸性增长可以参照下图:

技术分享

还有一个缺点就是不容易增加其他产品类,增加一个产品类就需要修改抽象工厂,那么所有具体工厂类也必须被修改。

下面我们看一下如何增加一条Computer3的生产线:

Computer3的配置是i7 CPU+华硕主板+金士顿内存。这时我们首先要实现一个i7的CPU(对应UML类图中的ProductA3):

package com.factory.demo;

public class I7CPU implements CPU {

	public void cpu() {
		System.out.println("i7处理器");

	}

}

然后是具体工厂类3,Computer3继承抽象工厂类(对应UML类图中的Factory3):

package com.factory.demo;

public class Computer3 extends ComputerFactory {
	/**
	 * 组装电脑3,i7 CPU+华硕主板+金士顿内存
	 * @return
	 */

	@Override
	public CPU createCPU() {
		return new I7CPU();
	}

	@Override
	public MainBoard createMainBoard() {
		return new ASUSMainBoard();
	}

	@Override
	public RAM createRAM() {
		return new KingStoneRAM();
	}


}

测试类增加Computer3的代码,增加后如下:

package com.factory.demo;

public class TestFactory {

	public static void main(String[] args) {
		//电脑1
		ComputerFactory computer1=new Computer1();
		System.out.println("组装产品类型1:");
		computer1.createCPU().cpu();
		computer1.createMainBoard().mainboard();
		computer1.createRAM().ram();
		
		//电脑2
		ComputerFactory computer2=new Computer2();
		System.out.println("组装产品类型2:");
		computer2.createCPU().cpu();
		computer2.createMainBoard().mainboard();
		computer2.createRAM().ram();
		
		//电脑3
		ComputerFactory computer3=new Computer3();
		System.out.println("组装产品类型3:");
		computer3.createCPU().cpu();
		computer3.createMainBoard().mainboard();
		computer3.createRAM().ram();

	}

}

运行实例如下:

技术分享

可以看出来扩展生产线变得很容易,系统扩展性大大增强。


喜欢的朋友关注我。




Java与设计模式-抽象工厂模式

标签:

原文地址:http://blog.csdn.net/yayun0516/article/details/50821408

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