java设计模式-工厂方法(Factory Method)模式 (图)

工厂方法模式



代表作品1:
其中,Iterator()方法就是一个工厂方法,同时java.util.Collection是个抽象工厂(至少对iterator()方法),而且是根抽象工厂,其子抽象工厂有java.util.List等,具体工厂有ArrayList等。(当然他们同时也是容器,这和工厂的概念毫不相干)

代表作品2:
其中Iterator(),listIterator()方法是工厂方法,另外Iterator,ListIterator接口还涉及到迭代子模式

代表作品3:
package com.javapatterns.factorymethod.url;

import java.net.*;
import java.io.*;

public class URLConnectionReader
{
public static void main(String[] args) throws Exception
{
URL yahoo = new URL("http://www.yahoo.com/");
URLConnection yc = yahoo. openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(
yc.getInputStream()));

String inputLine;

while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
URL类 使用了工厂方法模式,利用 openConnection()方法返回一个 URLConnection 类型的对象.
时序图:

据我猜测[guest]
1.在使用new URL("http://www.yahoo.com/");方法时,URL类就通过"协议"选择了合适的具体工厂用来创建具体的
URLConnection类...;(这点可能猜错了吧, 简单工厂模式了,不过嘛也可能不错,毕竟这样方便啊,URL类又不是专门来讲工厂方法的,在看下面的

2.URLStreamHandler很肯能就是传说中的抽象工厂,通过方法:URL(String protocol, String host, int port, String file, URLStreamHandler handler)构造函数传入具体工厂

3.从2中可以体现出工厂方法模式比简单工厂模式好的地方:当有新产品时,你不需要修改工厂方法-
URLStreamHandler,只要再写个实现 URLStreamHandler的 具体工厂,如AHandler,并调用new URL(*,*, AHandler );方法把 具体工厂 AHandler放进去就可以了。此时在调用 openConnection()方法,嘿嘿,至此你的新产品就返回了


呵呵,只是猜测,希望对啊[quest-?]

注意:这个例子与上面两个不同,上面那两个例子中的Collection,List类本身分别就是第一级,第二级的抽象工厂,而本例说的是URL是使用了工厂方法,它本身并不是
抽象工厂 [guest]


其它:
图片来自:《java与模式》

写在最后:
体会有这么几个:温故而知新(其实我觉得是迭代学习);欲速则不达;无心插柳柳成荫
要不是我写博客需要回忆一下,就不会有现在的体会,比前两天体会深多了,以后看书就按照这个办法吧:
1.粗读
2.细读(复习,体会)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值