设计模式之抽象工厂模式
抽象工厂的任务是为创建一组或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类。
与工厂方法不同的是,工厂方法一般用于生产一个类型的产品,抽象工厂一般用于创建一个产品簇,譬如生产不同系列的电脑A1,A2,A1与A2有不同的CPU、显卡、电池,但A1的CPU、显卡、电池都比A2系列的要好,两个系列采用的零件不同,这时就可以利用抽象工厂来解决这个问题。
又譬如我接下来的例子,由于编写这篇博客的日子是10.24,程序员的大日子(手动滑稽),身为单身猿的我,想着找个对象不就是new一个的事吗?但这种大日子,不能太自私,于是为了满足广大群众的需求,就使用了抽象工厂来生产不同类型的girlfriend来符合不同人的口味,比如有人想要身材好长得好的,有人喜欢胖点的……
UML暂时还没画好,以后补充……
示例代码
生产女朋友的抽象工厂类:
public abstract class GirlfriendFactory {
//创造身材
public abstract Figure createFigure();
//创建头发颜色
public abstract Hair createHair();
//创建脸
public abstract Face createFace();
}
身材相关类:
public interface Figure {
/**
* 身材
* @return
*/
public String figure();
}
public class HotFigure implements Figure{
public String figure() {
// TODO Auto-generated method stub
return "身材火辣的";
}
}
public class SlimFigure implements Figure{
public String figure() {
// TODO Auto-generated method stub
return "身材纤细的";
}
}
头发相关类:
public interface Hair {
/**
* 头发
* @return
*/
public String hair();
}
public class BlackHair implements Hair{
public String hair() {
// TODO Auto-generated method stub
return "黑色头发的";
}
}
public class BlondeHair implements Hair{
public String hair() {
// TODO Auto-generated method stub
return "金色头发的";
}
}
脸型相关类:
public interface Face {
/**
* 脸型
* @return
*/
public String face();
}
public class GoodFace implements Face{
public String face() {
// TODO Auto-generated method stub
return "面容娇好的";
}
}
public class MediumFace implements Face{
public String face() {
// TODO Auto-generated method stub
return "长相一般的";
}
}
生产完美女神的工厂类:
public class PerfectGirlFriendFactory extends GirlfriendFactory{
public Figure createFigure() {
// TODO Auto-generated method stub
return new HotFigure();
}
public Hair createHair() {
// TODO Auto-generated method stub
return new BlackHair();
}
public Face createFace() {
// TODO Auto-generated method stub
return new GoodFace();
}
}
生产普通女神的相关类:
public class NormalGirlFriendFactory extends GirlfriendFactory{
public Figure createFigure() {
// TODO Auto-generated method stub
return new SlimFigure();
}
public Hair createHair() {
// TODO Auto-generated method stub
return new BlondeHair();
}
public Face createFace() {
// TODO Auto-generated method stub
return new MediumFace();
}
}
测试类:
public class Test {
public static void main(String[] args) {
String s;
GirlfriendFactory pgf = new PerfectGirlFriendFactory();
s = pgf.createFace().face();
s += pgf.createHair().hair();
s += pgf.createFigure().figure();
System.out.println("你要求的"+s+"女朋友出世了");
System.out.println("****************************");
GirlfriendFactory pgfm = new NormalGirlFriendFactory();
s = pgfm.createFace().face();
s += pgfm.createHair().hair();
s += pgfm.createFigure().figure();
System.out.println("你要求的"+s+"女朋友出世了");
}
}
测试结果:
关于抽象工厂:
抽象工厂的优点在于使用者不需要知道具体的产品类,使使用者和产品解耦,充分体现了面向抽象编程。
但缺点也随之而见,类爆炸式的增长,以及我们如果需要添加产品类的新特性(如我要定制girlfriend的身高)时,不可避免的要修改所有的具体工厂类。因此不要为了使用设计模式而使用设计模式,设计模式为我们提供了更好的解耦、扩展、维护等特性,但或多或少都会都会带来类的增长,注意实际开发的权衡。好了,大家去写自己的girlfriend吧(再次手动滑稽)。