职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 377|回复: 4

[设计模式]简单工厂

[复制链接]
芷馨 发表于 2011-8-31 08:24 | 显示全部楼层 |阅读模式
连接: http://samwong.iteye.com/

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

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

  
<SPAN style="COLOR: #0000ff">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);</SPAN>  

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实例,而不用理会物件实例化与依赖关係建立的细节:


  
<SPAN style="COLOR: #0000ff">Session session = someWhere.getSession();   
Message message = MessageFactory.getMessage(session);   
mailService.send(message);</SPAN>  

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

  

Simple Factory 的类别图如下所示:





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

  
<SPAN style="COLOR: #0000ff">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()</SPAN>  

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
查看图片附件

能文能武 发表于 2011-8-31 08:25 | 显示全部楼层
最近都爱上了写设计模式

jinchang 发表于 2011-8-31 08:25 | 显示全部楼层
没看懂,不过我真想好好学习学习

jinchang 发表于 2011-8-31 08:25 | 显示全部楼层
在图书馆借了本设计模式java手册,介绍23种设计模式的,不错

jinchang 发表于 2011-8-31 08:25 | 显示全部楼层
这哪里是简单工厂啊。这是建造模式
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-5 07:07 , Processed in 0.131589 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表