<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>designpattern / Drkcore</title><link>http://blog.kzfmix.com/designpattern</link><description>Programming, Music, Snowboarding</description><language>ja</language><lastBuildDate>Thu, 01 Mar 2007 22:08:36 +0919</lastBuildDate><item><title>Spiffyでテンプレートメソッドを書いてみた</title><link>http://blog.kzfmix.com/entry/1172754516</link><description>&lt;p&gt;Kwikiで使われている&lt;a href="http://mfpm.blogdb.jp/app/view/Spiffy/"&gt;Spiffy&lt;/a&gt;が気になったので
&lt;a href="http://blog.kzfmix.com/entry/1142490333"&gt;テンプレートメソッド&lt;/a&gt;を書いてみた。&lt;/p&gt;
&lt;p&gt;-Baseで継承すると、$self=shiftとパッケージの最後に1;をつけなくてもよくなるので、コード量が減るらしい&lt;/p&gt;
&lt;h4&gt;AbstractDisplay.pm&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="n"&gt;AbstractDisplay&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;Spiffy&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;stub&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;open&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;stub&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;print&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;stub&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;close&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;display&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;close&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;CharDisplay.pm&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="n"&gt;CharDisplay&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;AbstractDisplay&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$char&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nb"&gt;bless&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$char&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;lt;&amp;lt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;$self-&amp;gt;{ch}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;gt;&amp;gt;\n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;StringDisplay.pm&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="n"&gt;StringDisplay&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;AbstractDisplay&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="nb"&gt;bless&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$w&lt;/span&gt;
       &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;_printline&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;|$self-&amp;gt;{string}|\n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;_printline&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;_printline&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;+&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;+\n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;main.pl&lt;/h4&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;#!/usr/bin/perl&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;CharDisplay&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="n"&gt;StringDisplay&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$d1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CharDisplay&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;H&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$d2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StringDisplay&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Hello, World.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$d3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StringDisplay&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;るるるるる&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$d1&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$d2&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$d3&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;で実行してみる。&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="s-Regexp"&gt;&amp;lt;&amp;lt;HHHHH&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;+-------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;World&lt;/span&gt;&lt;span class="o"&gt;.|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;World&lt;/span&gt;&lt;span class="o"&gt;.|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;World&lt;/span&gt;&lt;span class="o"&gt;.|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;World&lt;/span&gt;&lt;span class="o"&gt;.|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;World&lt;/span&gt;&lt;span class="o"&gt;.|&lt;/span&gt;
&lt;span class="o"&gt;+-------------+&lt;/span&gt;
&lt;span class="o"&gt;+---------------+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="err"&gt;るるるるる&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="err"&gt;るるるるる&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="err"&gt;るるるるる&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="err"&gt;るるるるる&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="err"&gt;るるるるる&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+---------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;抽象クラスのstubは実装をサブクラスに任すときに使う。サブクラスで実装されてないとdieする。&lt;/p&gt;
&lt;p&gt;試しに、CharDisplayのprintメソッドがないと&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Method&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="n"&gt;AbstractDisplay&lt;/span&gt; &lt;span class="n"&gt;must&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;subclassed&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;
&lt;span class="sr"&gt;/usr/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="sr"&gt;/perl5/si&lt;/span&gt;&lt;span class="n"&gt;te_perl&lt;/span&gt;&lt;span class="sr"&gt;/5.8.8/&lt;/span&gt;&lt;span class="n"&gt;Spiffy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pm&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;279&lt;/span&gt;
        &lt;span class="nn"&gt;Spiffy::&lt;/span&gt;&lt;span class="n"&gt;__ANON__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;CharDisplay=HASH(0x9a49c28)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;
        &lt;span class="n"&gt;called&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;AbstractDisplay&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pm&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;
        &lt;span class="nn"&gt;AbstractDisplay::&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;CharDisplay=HASH(0x9a49c28)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;
        &lt;span class="n"&gt;called&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;とエラー吐いてとまる。&lt;/p&gt;
&lt;p&gt;コードの見通しは良くなる感じ(もうちょっと複雑なことやってみないと分からんけど。)&lt;/p&gt;</description><pubDate>Thu, 01 Mar 2007 22:08:36 +0919</pubDate><category>designpattern</category><category>デザパタ</category></item><item><title>Prototype ( デザパタPerl )</title><link>http://blog.kzfmix.com/entry/1144830365</link><description>&lt;p&gt;今回はperlのモジュール使って書いたヨ、というわけではなくインスタンスのコピーってどうやってつくんの？っていう話題だ。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/naoya/20050813/1123961196" title="naoyaのはてなダイアリー - prototype.js でデザインパターン - Prototype"&gt;naoyaのはてなダイアリー - prototype.js でデザインパターン - Prototype&lt;/a&gt;
&lt;blockquote&gt;登録されてるインスタンスを連想配列から取り出して返却するのですが、そのときにそのまま取り出して返却するんではなく、インスタンスに実装されてる createClone() を呼び出して返却すると。createClone() の中ではインスタンスのコピーが行われます。&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;で、&lt;a href="http://hatena.dyndns.org/~jkondo/DesignPattern/Prototype/"&gt;Perlサンプル&lt;/a&gt;のProduct.pmみてみると&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;pre&gt;&lt;code&gt;sub clone {
    my $self = shift;
    my $class = ref($self);
    bless {%{$self}}, $class;
}

sub createclone {
    my $self = shift;
    return $self-&gt;clone;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;{%{$self}}&lt;/strong&gt;がさっぱしわからん。なんでこれでインスタンス(ハッシュのリファレンス)のコピーが出来んの？&lt;/p&gt;
&lt;p&gt;ってことを追求だ。&lt;/p&gt;
&lt;p&gt;まず、インスタンスが異なるのかどうか、リファレンスをプリントして確認するためにmain.plをいじくる。&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;pre&gt;&lt;code&gt;use strict;

use Manager;
use UnderlinePen;
use MessageBox;

my $manager = Manager-&gt;new;
my $upen = UnderlinePen-&gt;new('~');
$manager-&gt;register("strong message", $upen);

my $p11 = $manager-&gt;create("strong message");
my $p12 = $manager-&gt;create("strong message");

print $p11,"\n";
print $p12,"\n";&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;で実行。&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;pre&gt;&lt;code&gt;$ perl main.pl 
UnderlinePen=HASH(0x8dc6604)
UnderlinePen=HASH(0x8dc78dc)&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;おー、かわっとる。うーん、、、、、&lt;/p&gt;
&lt;p&gt;素直に考えると&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$selfが%{$self}でリファレンスからハッシュへ&lt;/li&gt;
&lt;li&gt;それをさらにbless {%{$self}},$classで無名ハッシュでブレスして戻す&lt;/li&gt;
&lt;li&gt;だから、コピーされてる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;んだろうなぁと思うんだけど。&lt;/p&gt;
&lt;p&gt;試しにProduct.pmのcloneメソッドをこんな感じで変えてみる。&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;pre&gt;&lt;code&gt;sub clone {
       my $self = shift;
       my $class = ref($self);
       bless \%{$self}, $class;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;でさっきとおなじmain.plを実行&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;pre&gt;&lt;code&gt;$ perl main.pl 
UnderlinePen=HASH(0x8491eb0)
UnderlinePen=HASH(0x8491eb0)&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;同じリファレンスだ。&lt;/p&gt;
&lt;p&gt;ということはreturnされるときにコピーされるのかなぁ。うーん結局わからん。無名ハッシュ生成のメカニズムあたりをちゃんとチェックすれば解決するのか？&lt;/p&gt;
&lt;p&gt;こういうメモリまわりを追っかける場合ってperl -dすればいいのかなぁ。&lt;/p&gt;
&lt;h2&gt;060412 追記&lt;/h2&gt;
&lt;p&gt;オブジェクト指向Perlマスターコースの3章に書いてあった&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4894713004/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/51HY53BJTFL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;オブジェクト指向Perlマスターコース―オブジェクト指向の概念とPerlによる実装方法&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    ダミアン コンウェイ&lt;br /&gt;
    ピアソンエデュケーション / ?円 ( 2001-02 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;refを使ってオブジェクトの型を調べつつ、新しく生成したオブジェクトをハッシュ間の単純代入をするといいらしい。&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;pre&gt;&lt;code&gt;%{objref2 = ref($objref1)-&gt;new()} = %{$objref1}&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;だから、こんな感じでオブジェクトはコピーできるそうなんだ。&lt;/p&gt;
&lt;blockquote&gt;
このエントリは結城浩さんの本と、それに載っている&lt;a href="http://hatena.dyndns.org/~jkondo/DesignPattern/"&gt;サンプルをPerlで書いた例&lt;/a&gt;をみながら考えたことをメモってます。あとは、&lt;a href="http://d.hatena.ne.jp/naoya/20050813/1123919908"&gt;はてなの伊藤さんのjavascriptでの例&lt;/a&gt;も参考にしてます。

間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。
&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797327030/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/51k0udCitAL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;増補改訂版Java言語で学ぶデザインパターン入門&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    結城 浩&lt;br /&gt;
    ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;

&lt;/blockquote&gt;</description><pubDate>Wed, 12 Apr 2006 17:26:05 +0919</pubDate><category>perl</category><category>designpattern</category></item><item><title>Factory Method ( デザパタPerl )</title><link>http://blog.kzfmix.com/entry/1142859758</link><description>&lt;p&gt;Factory Methodはちゃんと理解するのにちょっと時間がかかった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インスタンスの生成がTemplate Methodで抽象化されている&lt;/li&gt;
&lt;li&gt;つまりインスタンス化をサブクラスに任せる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;というところがポイントだが、ここの部分は抽象メソッドでなくても、デフォルトのメソッドを用意してもいいし、エラー吐くようにしてもいいらしい。&lt;a href="http://www.ncfreak.com/asato/doc/patterns/factorymethod.html"&gt;ココ&lt;/a&gt;など詳しいが、&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/naoya/20050813/1123923325" title="naoyaのはてなダイアリー - prototype.js でデザインパターン - Factory Method"&gt;naoyaのはてなダイアリー - prototype.js でデザインパターン - Factory Method&lt;/a&gt;
&lt;blockquote&gt;クライアントで利用する主人公であるところのインスタンスの生成ロジックを Factory の中に抽象化してやって、具体的な new によるインスタンス生成の束縛からクラスを解放してやりましょう、ということになります。&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;つまり、コンストラクトするメソッドを適当な方法で実際のクラスと切り離すという理解でいいのかな。&lt;/p&gt;
&lt;p&gt;CPAN探してみたら&lt;a href="http://mfpm.blogdb.jp/app/view/ClassFactory/"&gt;Class::Factory&lt;/a&gt;
というモジュールを見つけたので、これを使ってデザパタ本のサンプルを書いてみた。&lt;/p&gt;
&lt;p&gt;まず、FactoryクラスはClass::Factoryを使うので特に書く必要はない(モジュールのインストールだけ)。で、IDCardFactoryクラスはこんな風に書くだけでラクチン。&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;pre&gt;&lt;code&gt;package IDCardFactory;
use strict;
use base qw(Class::Factory);

__PACKAGE__-&gt;register_factory_type( IDCard =&gt; 'IDCard' );

1;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Productクラスもサンプルの通り、何はともあれuse出来るもの&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;pre&gt;&lt;code&gt;package Product;
use strict;

sub use { die; }

1;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;で、実際のプロダクトの生成メソッドはinitなのでここをちょっと書く（といってもサンプルのnewとほとんど変わらんが）&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;pre&gt;&lt;code&gt;package IDCard;
use strict;
use base qw(Product);

sub init {
    my ( $self, $owner) = @_;
    $self-&gt;{owner} = $owner;
    print "$self-&gt;{owner}のカードを作ります。\n";
    return $self;
}

sub use {
    my $self = shift;
    print "$self-&gt;{owner}のカードを使います。\n";
}

sub getowner {
    my $self = shift;
    return $self-&gt;{owner};
}

1;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;さてメイン&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/perl
BEGIN { unshift(@INC, "./"); }

use strict;
use IDCardFactory;

my $card1 = IDCardFactory-&gt;new('IDCard','kzfm');
my $card2 = IDCardFactory-&gt;new('IDCard','愛犬はな');
my $card3 = IDCardFactory-&gt;new('IDCard','U隊長');
my $card4 = IDCardFactory-&gt;new('IDCard','新入りゆき');

$card1-&gt;use;
$card2-&gt;use;
$card3-&gt;use;
$card4-&gt;use;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;で、実行結果&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;pre&gt;&lt;code&gt;$./main.pl 
kzfmのカードを作ります。
愛犬はなのカードを作ります。
U隊長のカードを作ります。
新入りゆきのカードを作ります。
kzfmのカードを使います。
愛犬はなのカードを使います。
U隊長のカードを使います。
新入りゆきのカードを使います。&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;これだと、ファクトリーのインスタンスが作られないのがサンプルと違うとこかな。あとはClass::Factoryのメソッドregister_factory_typeで幾つかのプロダクトを登録できるので、IDCardFactoryではなくてCardFactoryにして、VISA,Master,Nojima,Kojima,Yamadaカードみたいに複数のカードを登録しとくのが正しい使い方なのかな。&lt;/p&gt;
&lt;blockquote&gt;
このエントリは結城浩さんの本と、それに載っている&lt;a href="http://hatena.dyndns.org/~jkondo/DesignPattern/"&gt;サンプルをPerlで書いた例&lt;/a&gt;をみながら考えたことをメモってます。あとは、&lt;a href="http://d.hatena.ne.jp/naoya/20050813/1123919908"&gt;はてなの伊藤さんのjavascriptでの例&lt;/a&gt;も参考にしてます。

間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。
&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797327030/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/51k0udCitAL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;増補改訂版Java言語で学ぶデザインパターン入門&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    結城 浩&lt;br /&gt;
    ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;

&lt;/blockquote&gt;</description><pubDate>Mon, 20 Mar 2006 22:02:38 +0919</pubDate><category>designpattern</category></item><item><title>Template Method ( デザパタPerl )</title><link>http://blog.kzfmix.com/entry/1142490333</link><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/naoya/20050813/1123922039" title="naoyaのはてなダイアリー - prototype.js でデザインパターン - Template Method"&gt;naoyaのはてなダイアリー - prototype.js でデザインパターン - Template Method&lt;/a&gt;
&lt;blockquote&gt;Iterator と Adapter では interface に相当するものは省略してきましたが、今回は抽象クラスをちゃんと用意します。JavaScript での interface みたいなものは Perl とかと一緒で実質意味を持ちませんが、抽象クラスなら実装がスーパークラスにちょこっとあるので意味があります。&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;Perlのコードだと、これのことか。&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;code&gt;&lt;pre&gt;sub display {
    my $self = shift;
    $self-&gt;open;
    for my $i (0..4) {
        $self-&gt;print;
    }
    $self-&gt;close;
}&lt;/pre&gt;&lt;/code&gt;
&lt;/blockquote&gt;

&lt;p&gt;なるほど。そうすると抽象クラスでopen,print,closeメソッドでdieしておくことに意味があるのかも。でも、javaにはあるfinal修飾子がperlにはないから、オーバーライドされてしまうという危険性は残るよなぁ。&lt;/p&gt;
&lt;blockquote&gt;
このエントリは結城浩さんの本と、それに載っている&lt;a href="http://hatena.dyndns.org/~jkondo/DesignPattern/"&gt;サンプルをPerlで書いた例&lt;/a&gt;をみながら考えたことをメモってます。あとは、&lt;a href="http://d.hatena.ne.jp/naoya/20050813/1123919908"&gt;はてなの伊藤さんのjavascriptでの例&lt;/a&gt;も参考にしてます。

間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。
&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797327030/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/51k0udCitAL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;増補改訂版Java言語で学ぶデザインパターン入門&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    結城 浩&lt;br /&gt;
    ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;

&lt;/blockquote&gt;</description><pubDate>Thu, 16 Mar 2006 15:25:33 +0919</pubDate><category>perl</category><category>designpattern</category></item><item><title>Singleton ( デザパタPerl )</title><link>http://blog.kzfmix.com/entry/1140696446</link><description>&lt;p&gt;Singletonは結城さんの本の言葉を借りれば&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;指定したクラスのインスタンスが絶対に一個しか存在しないことを保証したい&lt;/li&gt;
&lt;li&gt;インスタンスが一個しかないことをプログラムで表現したい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということになるわけですが、&lt;/p&gt;
&lt;p&gt;perlでは&lt;strong&gt;コンストラクタをprivateにしてしまう&lt;/strong&gt;ということが出来ないので、&lt;a href="http://www.atmarkit.co.jp/fjava/javatips/075java007.html"&gt;ココ&lt;/a&gt;みたいにはいかないのは、&lt;a href="http://norainu.net/mt/archives/2005/11/classsingleton.html"&gt;おまえののログ&lt;/a&gt;
に書いてある通りなのは理解できる。&lt;/p&gt;
&lt;p&gt;でも、&lt;a href="http://hatena.dyndns.org/~jkondo/DesignPattern/Singleton/"&gt;perlサンプル&lt;/a&gt;とか&lt;a href="http://www.perldesignpatterns.com/?SingletonPattern"&gt;ココ&lt;/a&gt;みたいに、&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;code&gt;&lt;pre&gt;
package Singleton;
use strict;
use vars qw($singleton);

sub new {
    $singleton and return $singleton;
    my $class = shift;
    my $self = {};
    $singleton = $self;
    print "インスタンスを生成しました。\n";
    bless $self, $class;
}

1;
&lt;/pre&gt;&lt;/code&gt;
&lt;/blockquote&gt;

&lt;p&gt;こんな感じで書くと駄目な理由がイマイチわからん。&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774122955/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/61QQA2FM41L._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;Web+DB press (特別総集編)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;
    技術評論社 / ?円 ( 2005-03 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;でも同じような書きかたしてたぞ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.hyuki.com/techinfo/singleton.html"&gt;http://www.hyuki.com/techinfo/singleton.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://homepage1.nifty.com/markey/memo/200207.html"&gt;http://homepage1.nifty.com/markey/memo/200207.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pc8.2ch.net/test/read.cgi/php/1069451782/"&gt;http://pc8.2ch.net/test/read.cgi/php/1069451782/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.atmarkit.co.jp/fjava/javatips/075java007.html"&gt;http://www.atmarkit.co.jp/fjava/javatips/075java007.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bulknews.net/lib/slides/llsaturday-2003/oop-perl.ppt"&gt;http://bulknews.net/lib/slides/llsaturday-2003/oop-perl.ppt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://norainu.net/mt/archives/2005/11/classsingleton.html"&gt;http://norainu.net/mt/archives/2005/11/classsingleton.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
このエントリは結城浩さんの本と、それに載っている&lt;a href="http://hatena.dyndns.org/~jkondo/DesignPattern/"&gt;サンプルをPerlで書いた例&lt;/a&gt;をみながら考えたことをメモってます。あとは、&lt;a href="http://d.hatena.ne.jp/naoya/20050813/1123919908"&gt;はてなの伊藤さんのjavascriptでの例&lt;/a&gt;も参考にしてます。

間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。
&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797327030/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/51k0udCitAL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;増補改訂版Java言語で学ぶデザインパターン入門&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    結城 浩&lt;br /&gt;
    ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;

&lt;/blockquote&gt;</description><pubDate>Thu, 23 Feb 2006 21:07:26 +0919</pubDate><category>perl</category><category>designpattern</category></item><item><title>デザインパターンとJAVA</title><link>http://blog.kzfmix.com/entry/1140564698</link><description>&lt;p&gt;perlでモジュール作るときに、グダグダになってくることが多いので、いっちょデザインパターンの勉強を！&lt;/p&gt;
&lt;p&gt;というわけで、購入したオライリーの本は言語がjavaだけど面白い。&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873112494/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/5172C1X4CWL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    Eric Freeman&lt;br /&gt;
    オライリージャパン / 4830円 ( 2005-12-02 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;買うときは4.6Kは費用対効果が、、、なんて思っていたが、コード自体は感覚的に理解できるのでなかなかためになる。&lt;/p&gt;
&lt;p&gt;とはいえ実際にperlではどう書くんじゃとなったときに困るので、&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774122955/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/61QQA2FM41L._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;Web+DB press (特別総集編)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;br /&gt;
    技術評論社 / ?円 ( 2005-03 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;のデザインパターン特集を見ながら一緒に勉強した。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;が、ちゃんとjavaを理解していないとオライリーの本がきちんと理解できん&lt;/strong&gt;ので、&lt;/p&gt;
&lt;p&gt;近所の本屋で結城浩の本を買って、年始に読破。&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797332115/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/41BhlhhDKCL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;改訂第2版 Java言語プログラミングレッスン (上)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    結城 浩&lt;br /&gt;
    ソフトバンククリエイティブ / 2520円 ( 2005-10-26 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797332123/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/41sZDuBMTqL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;改訂第2版 Java言語プログラミングレッスン (下)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    結城 浩&lt;br /&gt;
    ソフトバンククリエイティブ / 2520円 ( 2005-10-26 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;上下巻ともに、すらすら読めてすごくわかりやすかった。特にインターフェースとかスレッドの部分はperlにはなかったような部分なのできちっと理解するように何度か読み返した(スレッドは5.8ではわからんけど)。上巻は基本的な部分でもともとある程度は理解していたのでほとんど斜め読みだったが、下巻はperlでoopを少しは理解していたという面もあるが、流れがスムーズでさらさら読み進めた。そして言語体系としてのjavaもちょっとは理解した(気がする)。&lt;/p&gt;
&lt;p&gt;特に予約語とか慣習とかは知らないとオライリーの本はきつい部分があるので、これからオライリーのデザインパターン本は2週目読みますゾ。&lt;/p&gt;</description><pubDate>Wed, 22 Feb 2006 08:31:38 +0919</pubDate><category>java</category><category>designpattern</category></item><item><title>Adaptor ( デザパタPerl )</title><link>http://blog.kzfmix.com/entry/1140012038</link><description>&lt;p&gt;結城さんの本には、委譲と継承の二通りの方法が記載されていたが、その二つの違い(メリット、デメリット)がイマイチ理解できなかったので、ググって見ると、&lt;a href="http://www.hyuki.com/yukiwiki/wiki.cgi?%B0%D1%BE%F9"&gt;YukiWiki&lt;/a&gt;に。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.hyuki.com/yukiwiki/wiki.cgi?%B0%D1%BE%F9" title="委譲 - Delegation"&gt;委譲 - Delegation&lt;/a&gt;
&lt;blockquote&gt;継承はそのインスタンスのなかの変数を使用するのに対し、委譲では委譲先のインスタンスの中の変数を使用する。(この説明は単に動作の違いを言っているだけかな。)
継承はインスタンスの振る舞い方を規定し、委譲はインスタンスの実装となる。
インスタンスの振る舞い方が変わると、そのインスタンスを利用するほうにも影響が出る。
インスタンスの実装は、使われ方で変わるが、利用するほうには影響が出にくい。&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;なんとなくわかったような、わからないような。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;継承はそのインスタンスのなかの変数を使用するのに対し、委譲では委譲先のインスタンスの中の変数を使用する&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;というあたりをよく考えてみるといいのだろう。&lt;/p&gt;
&lt;p&gt;perlで確認してみると、
&lt;a href="http://hatena.dyndns.org/~jkondo/DesignPattern/Adapter/"&gt;サンプル&lt;/a&gt;は委譲を使っているので、僕はちょっと継承を用いたperlサンプルを書いてみた。&lt;/p&gt;
&lt;p&gt;main.plとBanner.pmは&lt;a href="http://hatena.dyndns.org/~jkondo/DesignPattern/Adapter/"&gt;サンプルのもの&lt;/a&gt;をそのまま使用。interfaceにあたるprinter.pmは使わなかった。&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;code&gt;&lt;pre&gt;
package PrintBanner;
use strict;
use base qw(Banner);

sub new {
    my $class = shift;
    my $string = shift;
    my $self = $class-&gt;SUPER::new($string);
    bless $self, $class;
}

sub printweak {
    my $self = shift;
    $self-&gt;show_with_paren;
}

sub printstrong {
    my $self = shift;
    $self-&gt;show_with_aster;
}

1;
&lt;/pre&gt;&lt;/code&gt;
&lt;/blockquote&gt;

&lt;p&gt;結局AdapteeとTargetの違いの大きさで使い分ければいいのかな?このサンプルだとメソッド名しか変わってないから、委譲を使ったほうがすっきりするのだろうか?&lt;/p&gt;
&lt;blockquote&gt;
このエントリは結城浩さんの本と、それに載っている&lt;a href="http://hatena.dyndns.org/~jkondo/DesignPattern/"&gt;サンプルをPerlで書いた例&lt;/a&gt;をみながら考えたことをメモってます。あとは、&lt;a href="http://d.hatena.ne.jp/naoya/20050813/1123919908"&gt;はてなの伊藤さんのjavascriptでの例&lt;/a&gt;も参考にしてます。

間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。
&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797327030/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/51k0udCitAL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;増補改訂版Java言語で学ぶデザインパターン入門&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    結城 浩&lt;br /&gt;
    ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;

&lt;/blockquote&gt;</description><pubDate>Wed, 15 Feb 2006 23:00:38 +0919</pubDate><category>perl</category><category>designpattern</category></item><item><title>Iterator::Utilをつかってみた ( デザパタPerl )</title><link>http://blog.kzfmix.com/entry/1139536100</link><description>&lt;p&gt;&lt;a href="http://blog.kzfmix.com/entry/1139492287"&gt;イテレータのサンプル&lt;/a&gt;を実際にIterator::Utilモジュール使って書いてみたゾ。&lt;/p&gt;
&lt;p&gt;今回、用意したのはBook,BookShelf,mainだ。インターフェースにあたる部分は省略ってことで。&lt;/p&gt;
&lt;p&gt;Bookは&lt;a href="http://hatena.dyndns.org/~jkondo/DesignPattern/"&gt;サンプル&lt;/a&gt;のコードをそのまま使用してます。
BookShelfはbooksメソッドで配列返すようにしといた。&lt;/p&gt;
&lt;blockquote class="terminal"&gt;
&lt;code&gt;&lt;pre&gt;
package BookShelf;
use strict;

sub new {
    my $class = shift;
    my $self = {};
    $self-&gt;{maxsize} = shift;
    $self-&gt;{books} = [];
    $self-&gt;{last} = 0;
    bless $self, $class;
}

sub appendbook {
    my $self = shift;
    my $book = shift;
    $self-&gt;{books}-&gt;[$self-&gt;{last}] = $book;
    $self-&gt;{last}++;
}

sub books {
    my $self = shift;
    $self-&gt;{books};
}

1;

&lt;/pre&gt;&lt;/code&gt;
&lt;/blockquote&gt;

&lt;p&gt;mainでIterator::Utilを呼ぶ。
&lt;blockquote class="terminal"&gt;
&lt;code&gt;&lt;pre&gt;&lt;/p&gt;
&lt;h1&gt;!/usr/bin/perl&lt;/h1&gt;
&lt;p&gt;use strict;
use BookShelf;
use Book;
use Iterator::Util;&lt;/p&gt;
&lt;p&gt;my $bookshelf = BookShelf-&amp;gt;new(5);
$bookshelf-&amp;gt;appendbook(Book-&amp;gt;new('Java言語で学ぶデザインパターン入門'));
$bookshelf-&amp;gt;appendbook(Book-&amp;gt;new('憂鬱なプログラマのためのオブジェクト指向開発講座'));
$bookshelf-&amp;gt;appendbook(Book-&amp;gt;new('かんたんUML'));
$bookshelf-&amp;gt;appendbook(Book-&amp;gt;new('プログラミングPerl'));
$bookshelf-&amp;gt;appendbook(Book-&amp;gt;new('オブジェクト指向Perlマスターコース'));&lt;/p&gt;
&lt;p&gt;my $it = iarray ($bookshelf-&amp;gt;books);&lt;/p&gt;
&lt;p&gt;while (my $book = $it-&amp;gt;value) {
    print $book-&amp;gt;getname."n";
}&lt;/p&gt;
&lt;p&gt;&lt;/pre&gt;&lt;/code&gt;
&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;実行結果はこんな感じ。最後のIterator is exhaustedがちょっと気持ち悪い。
&lt;blockquote class="terminal"&gt;
&lt;code&gt;&lt;pre&gt;
$ perl main.pl 
Java言語で学ぶデザインパターン入門
憂鬱なプログラマのためのオブジェクト指向開発講座
かんたんUML
プログラミングPerl
オブジェクト指向Perlマスターコース
Iterator is exhausted at main.pl line 18
&lt;/pre&gt;&lt;/code&gt;
&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797327030/ref%3Dnosim/kaerutyuuihou-22/249-1711488-1658738"&gt;増補改訂版Java言語で学ぶデザインパターン入門&lt;/a&gt;の&lt;strong&gt;あなたの考えを広げるためのヒント&lt;/strong&gt;(ここがおもろい)には、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;実装とは切り離して数え上げできることが重要&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;とか書いてあるので、まぁ、これでいいのかな。&lt;/p&gt;
&lt;blockquote&gt;
このエントリは結城浩さんの本と、それに載っている&lt;a href="http://hatena.dyndns.org/~jkondo/DesignPattern/"&gt;サンプルをPerlで書いた例&lt;/a&gt;をみながら考えたことをメモってます。あとは、&lt;a href="http://d.hatena.ne.jp/naoya/20050813/1123919908"&gt;はてなの伊藤さんのjavascriptでの例&lt;/a&gt;も参考にしてます。

間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。
&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797327030/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/51k0udCitAL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;増補改訂版Java言語で学ぶデザインパターン入門&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    結城 浩&lt;br /&gt;
    ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;

&lt;/blockquote&gt;</description><pubDate>Fri, 10 Feb 2006 10:48:20 +0919</pubDate><category>perl</category><category>designpattern</category></item><item><title>Iterator ( デザパタPerl )</title><link>http://blog.kzfmix.com/entry/1139492287</link><description>&lt;p&gt;&lt;a href="http://hatena.dyndns.org/~jkondo/DesignPattern/Iterator/"&gt;Perlの例&lt;/a&gt;だとインターフェースのクラスをdieしているので、最初これはどういう意味があるのかわかんなかったが、&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/naoya/20050813/1123919908" title="naoyaのはてなダイアリー - prototype.js でデザインパターン - Iterator"&gt;naoyaのはてなダイアリー - prototype.js でデザインパターン - Iterator&lt;/a&gt;
&lt;blockquote&gt;
デザパタ本のコードでは Java の interface をまず用意して、となるのですが例によって JavaScript は動的な言語かつ型がないのでサブクラスに実装を強制させるメカニズムがない。ということで、ここでは interface に相当するものは用意せずに Concrete クラスだけで実装します。
&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;と書いてあったのを見てサブクラスで実装されてない場合によばれた場合のためのちょっとした仕組みなのだとわかった（あがきにちかいような気もするが）。で、試しにjavaで実際にインターフェースを実装してるクラスのメソッド名変えてみたらコンパイルできなかったし、をを～、javaのインターフェースって束縛としては便利だよなと思ったり。言語の違いってなかなかおもろいなぁと感じた瞬間だったり。&lt;/p&gt;
&lt;p&gt;あと、&lt;a href="http://www.freeml.com/message/patterns/1002"&gt;こういうやり方&lt;/a&gt;もあるらしい。&lt;/p&gt;
&lt;blockquote&gt;
オブジェクトをハッシュデータ構造と透過に扱う際に、tie ハッシュのインターフェースで NEXTKEY() というメソッドを実装しますが、これがまさに iterator なので、
&lt;/blockquote&gt;

&lt;p&gt;って部分がイマイチ飲み込めなったので、実用PerlプログラミングのTieのとこと型グロブの章をよく読んでなんとなく理解した。（理解した気になった?）&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4900900826/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/51V51T5Z27L._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;実用Perlプログラミング&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    スリラム スリニバサン&lt;br /&gt;
    オライリー・ジャパン / ?円 ( 1998-11 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;で、CPANもいくらか調べてみたところ、&lt;a href="http://search.cpan.org/~roode/Iterator-Util-0.02/Util.pm"&gt;Iterator::Util&lt;/a&gt;というのがよさげなのかな?この場合はiappendを使えばいいのかな？&lt;/p&gt;
&lt;p&gt;明日コードを書いてみよう。&lt;/p&gt;
&lt;blockquote&gt;
このエントリは結城浩さんの本と、それに載っている&lt;a href="http://hatena.dyndns.org/~jkondo/DesignPattern/"&gt;サンプルをPerlで書いた例&lt;/a&gt;をみながら考えたことをメモってます。あとは、&lt;a href="http://d.hatena.ne.jp/naoya/20050813/1123919908"&gt;はてなの伊藤さんのjavascriptでの例&lt;/a&gt;も参考にしてます。

間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。
&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797327030/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/51k0udCitAL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;増補改訂版Java言語で学ぶデザインパターン入門&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    結城 浩&lt;br /&gt;
    ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;

&lt;/blockquote&gt;</description><pubDate>Thu, 09 Feb 2006 22:38:07 +0919</pubDate><category>perl</category><category>designpattern</category></item><item><title>Perlでデザインパターン</title><link>http://blog.kzfmix.com/entry/1139229113</link><description>&lt;p&gt;&lt;a href="http://blog.kzfmix.com/entry/1140564698"&gt;HeadFirst&lt;/a&gt;みても、なかなかperlでのデザインパターンが飲み込めないぁと悩んでいたら、結城 浩さんの本をいろんな言語で書いてるのを見つけた。
で、その中に&lt;a href="http://www.hyuki.com/dp/dpml.html#lang"&gt;Perlでデザインパターン&lt;/a&gt;も発見。はてなのえらいヒト?だよね。&lt;/p&gt;
&lt;p&gt;というわけで、買ってみた。&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797327030/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/51k0udCitAL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;増補改訂版Java言語で学ぶデザインパターン入門&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    結城 浩&lt;br /&gt;
    ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;AbstractFactoryくらいまで読んだが、名著の予感。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;だって面白いんだもん&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;そして、perlのサンプル素敵、全部消化してから次のパターンに移ってる。で、もちろんjavaも書いて実行している(eclipseで)。&lt;/p&gt;
&lt;p&gt;当分、この本の追っかけメモになるかも。本に関して一言いうならば、イタリック体はもうちょいイタリックっぽくして欲しかったね。いまんとこそれだけ。&lt;/p&gt;</description><pubDate>Mon, 06 Feb 2006 21:31:53 +0919</pubDate><category>perl</category><category>designpattern</category></item></channel></rss>