Abstract Factory模式

Abstract Factory模式

What

“abstract”:不考虑具体怎样实现,而是仅关注接口的状态

“abstract factory":将”抽象零件“组装为”抽象产品“

Why

为什么要使用Abstract Factory?

用于生成复杂的实例

与Builder模式有什么不同的应用场景?

Builder模式更像是个人用户,更适合使用者指定产品零件,交由专业人士组装,即DIY。

Abstract Factory模式更像是工厂流水线生产,适合使用者亲自使用零部件装配产品,且产品零件不易更换。

两者的主要应用场景区别在于使用者的需求是否需频繁定制零部件。

与Builder的使用方法有何不同?

Builder的产品构建交由Director来解决,Abstract Factory的产品构建由自己定义。

Builder模式中,用户可自己确定由什么零件来交给Director进行生产。

Abstract Factory模式中,用户由Factory来创建零件,自己进行产品生产。

How

  • 定义产品所需的零件

  • 定义工厂里的接口用以创建零件

  • 具体实现创建零件的方法

  • 具体实现生成产品的方法

  • 用户使用工厂来创建零件,并组装。

// 用户使用方法
public class Main {
    public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("Usage: java Main class.name.of.ConcreteFactory");
            System.out.println("Example 1: java Main listfactory.ListFactory");
            System.out.println("Example 2: java Main tablefactory.TableFactory");
            System.exit(0);
        }
        Factory factory = Factory.getFactory(args[0]);

        Link people = factory.createLink("人民日报", "http://www.people.com.cn/");
        Link gmw = factory.createLink("光明日报", "http://www.gmw.cn/");

        Link us_yahoo = factory.createLink("Yahoo!", "http://www.yahoo.com/");
        Link jp_yahoo = factory.createLink("Yahoo!Japan", "http://www.yahoo.co.jp/");
        Link excite = factory.createLink("Excite", "http://www.excite.com/");
        Link google = factory.createLink("Google", "http://www.google.com/");

        Tray traynews = factory.createTray("日报");
        traynews.add(people);
        traynews.add(gmw);

        Tray trayyahoo = factory.createTray("Yahoo!");
        trayyahoo.add(us_yahoo);
        trayyahoo.add(jp_yahoo);

        Tray traysearch = factory.createTray("检索引擎");
        traysearch.add(trayyahoo);
        traysearch.add(excite);
        traysearch.add(google);

        Page page = factory.createPage("LinkPage", "杨文轩");
        page.add(traynews);
        page.add(traysearch);
        page.output();
    }
}

类图

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值