论坛首页 Java企业应用论坛

[设计模式]简单工厂

浏览 4747 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-15   最后修改:2010-12-15

连接: http://samwong.iteye.com/

 

Simple Factory模式又称Static Factory模式。一个Simple Factory生产成品,而对客户端隐藏产品产生的细节,物件如何生成,生成前是否与其它物件建立依赖关係,客户端皆不用理会,用以将物件生成方式之变化与客户端程式码隔离。

假设今天,您要建立一个Message物件,这个Message物件会有一连串的物件实例化与依赖关係建立流程:

Session session = someWhere.getSession();
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(session.from));
msg.setSubject(session.subject);
msg.setText(session.text);
msg.setHeader(session.headerName, session.headerValue);
msg.setDate(session.date);
...
mailService.send(msg);

 



若这样的流程是固定的,您可以将以上的细节封装在一个类别中成为其静态方法:
public class MessageFactory {
    public static Message getMessage(Session session) {
        Message msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(session.from));
        msg.setSubject(session.subject);
        msg.setText(session.text);
                msg.setHeader(session.headerName, session.headerValue);
        msg.setDate(session.date);
        ...
        return msg;
    }
}

对使用MessageFactory的客户端,可以这麽取得Message实例,而不用理会物件实例化与依赖关係建立的细节:

Session session = someWhere.getSession();
Message message = MessageFactory.getMessage(session);
mailService.send(message);

 


Simple Factory 的类别图如下所示:


 


UML类别图中,传回型态Product意指的是具有Product所定义之公开协定(物件上的公开方法)的物件,而不是专指Java中的interface定义。以Python来说,以下也是个Simple Factory的实现:

class Message:
    def __init__(self, addr, msg):
        self.addr = addr
        self.msg = msg
      
    def send(self):
        print("send message '%s' to '%s'" % (self.msg, self.addr))

class MessageFactory:
    def getMessage(addr, msg):
        message = Message(addr, msg)
        # 作一些有的没的
        return message

msg = MessageFactory.getMessage("caterpillar@openhome.cc", "Hi")
msg.send()

 



Python的变数没有型态,真正的型态资讯是在物件之上,就客户端的角度而言,要确定的是传回物件必然拥有send()公开方法。

Simple Factory使用静态方法来简单地隐藏物件建立细节。撇开静态方法不谈,隐藏物件建立的细节仍是Factory模式的重点,可将这个模式推至极緻,而成为一种通用、专门用来生成物件、建立依赖关係、甚至具备管理物件生命週期职责的轻量级容器。


参考:

samwong博客

http://samwong.iteye.com/

  • 大小: 18.8 KB
   发表时间:2010-12-17  
最近都爱上了写设计模式
0 请登录后投票
   发表时间:2010-12-17  
没看懂,不过我真想好好学习学习
0 请登录后投票
   发表时间:2010-12-19  
在图书馆借了本设计模式java手册,介绍23种设计模式的,不错
0 请登录后投票
   发表时间:2010-12-19  
这哪里是简单工厂啊。这是建造模式
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics