设计模式之抽象工厂模式

设计模式之抽象工厂模式

抽象工厂的任务是为创建一组或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类。

与工厂方法不同的是,工厂方法一般用于生产一个类型的产品,抽象工厂一般用于创建一个产品簇,譬如生产不同系列的电脑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吧(再次手动滑稽)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值