{"id":118,"date":"2010-07-14T16:09:29","date_gmt":"2010-07-14T16:09:29","guid":{"rendered":"http:\/\/ketoha.co.jp\/blog\/archives\/118"},"modified":"2015-01-02T06:33:37","modified_gmt":"2015-01-02T06:33:37","slug":"%e3%83%87%e3%82%b6%e3%82%a4%e3%83%b3%e3%83%91%e3%82%bf%e3%83%bc%e3%83%b3-factory-method-%ef%bc%88php%ef%bc%86ruby%ef%bc%89","status":"publish","type":"post","link":"https:\/\/ketoha.co.jp\/blog\/?p=118","title":{"rendered":"\u30c7\u30b6\u30a4\u30f3\u30d1\u30bf\u30fc\u30f3 Factory method \uff08php\uff06ruby\uff09"},"content":{"rendered":"<p>\u30c7\u30b6\u30a4\u30f3\u30d1\u30bf\u30fc\u30f3\u306e<a href=\"http:\/\/www.google.co.jp\/search?q=%83f%83U%83C%83%93%83p%83^%81[%83%93+factory+method\">Factory method<\/a>\u306f\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3059\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u30b5\u30d6\u30af\u30e9\u30b9\u304c\u6c7a\u3081\u307e\u3059\u3002\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3055\u308c\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306f\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u30af\u30e9\u30b9\u306b\u3088\u308aI\/F\u3092\u898f\u5b9a\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u5171\u901a\u306eAPI\u304c\u5b9f\u88c5\u3055\u308c\u307e\u3059\u3002<br \/>\n\u3053\u306e\u3053\u3068\u306b\u3088\u308a\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3059\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u7a2e\u985e\u304c\u5897\u3048\u3066\u3082\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u65b9\u6cd5\u3092\u30b5\u30d6\u30af\u30e9\u30b9\u306b\u96c6\u7d04\u3059\u308b\u3060\u3051\u3067\u6e08\u307f\u307e\u3059\u3002<br \/>\n\u305f\u3068\u3048\u3070\u3001\u3068\u3042\u308b\u30d0\u30c3\u30c1\u51e6\u7406\u304c\u6392\u4ed6\u5236\u5fa1\u3092\u4ed5\u69d8\u3068\u3057\u3066\u3082\u3063\u3066\u3044\u308b\u3068\u3057\u307e\u3059\u3002\u6392\u4ed6\u5236\u5fa1\u3092\u5b9f\u73fe\u3059\u308b\u305f\u3081\u306b\u3001\u3053\u3053\u3067\u306f\u3075\u305f\u3068\u304a\u308a\u306e\u65b9\u6cd5\u3092\u63d0\u6848\u3057\u307e\u3059\u3002<br \/>\n\u3072\u3068\u3064\u306f\u3001\u5b9f\u884c\u958b\u59cb\u6642\u306b\u30ed\u30c3\u30af\u30d5\u30a1\u30a4\u30eb\u3092\u7528\u610f\u3057\u3066\u3001\u5b9f\u884c\u5b8c\u4e86\u6642\u306b\u30ed\u30c3\u30af\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664\u3059\u308b\u65b9\u6cd5\u3067\u3059\u3002\u5b9f\u884c\u958b\u59cb\u6642\u306b\u30ed\u30c3\u30af\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u77e5\u3059\u308b\u3068\u3001\u4ed6\u306b\u5b9f\u884c\u4e2d\u306e\u30d7\u30ed\u30bb\u30b9\u304c\u3042\u308b\u3068\u5224\u65ad\u3057\u3066\u51e6\u7406\u3092\u4e2d\u65ad\u3057\u307e\u3059\u304c\u3001\u3044\u3061\u3044\u3061\u30c7\u30a3\u30b9\u30afIO\u304c\u767a\u751f\u3057\u307e\u3059\u3002<br \/>\n\u3082\u3046\u3072\u3068\u3064\u306f\u3001\u5b9f\u884c\u958b\u59cb\u6642\u306b\u30d7\u30ed\u30bb\u30b9ID\u3092\u78ba\u8a8d\u3057\u3066\u3001\u30ab\u30ec\u30f3\u30c8\u306e\u30d7\u30ed\u30bb\u30b9ID\u4ee5\u5916\u306b\u5b9f\u884c\u3057\u3066\u3044\u308b\u3082\u306e\u304c\u3042\u308c\u3070\u591a\u91cd\u5b9f\u884c\u3068\u5224\u65ad\u3057\u3066\u51e6\u7406\u3092\u4e2d\u65ad\u3059\u308b\u65b9\u6cd5\u3067\u3059\u3002\u3053\u3061\u3089\u306e\u65b9\u304c\u9ad8\u901f\u3067IO\u3082\u767a\u751f\u3057\u307e\u305b\u3093\u304c\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u3088\u3063\u3066\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u304c\u5236\u9650\u3055\u308c\u3066\u3044\u308b\u3068\u304b\u3001\u30db\u30fc\u30e0\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3088\u308a\u4e0a\u3092\u53c2\u7167\u3067\u304d\u306a\u3044\u3088\u3046\u306a\u74b0\u5883\u3067\u306f\u3046\u307e\u304f\u52d5\u304b\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002<br \/>\n\u6c4e\u7528\u6027\u3092\u8003\u616e\u3057\u3066\u3001\u4e21\u65b9\u306e\u6a5f\u80fd\u3092\u74b0\u5883\u6761\u4ef6\u306b\u3088\u3063\u3066\u4f7f\u3044\u5206\u3051\u3089\u308c\u308b\u3088\u3046\u306b\u3057\u3066\u304a\u304d\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<br \/>\n\u666e\u901a\u306b\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u3059\u308b\u3068\u3001\u3053\u3046\u3044\u3046\u5834\u5408\u306f\u5229\u7528\u5074\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u5185\u306b\u74b0\u5883\u6761\u4ef6\u306b\u3088\u308b\u5834\u5408\u308f\u3051\u3092if\u6587\u3084switch\u6587\u306a\u3069\u3092\u4f7f\u3063\u3066\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3059\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u9078\u3079\u308b\u3088\u3046\u306b\u3057\u3066\u3044\u304f\u3068\u601d\u3044\u307e\u3059\u3002<br \/>\n\u3057\u304b\u3057\u3053\u308c\u3060\u3068\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3059\u308b\u7a2e\u985e\u304c\u5897\u3048\u305f\u5834\u5408\u306b\u53ef\u8aad\u6027\u304c\u843d\u3061\u3066\u3044\u304d\u307e\u3059\u3057\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3055\u308c\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u304c\u7d71\u4e00\u3055\u308c\u3066\u3044\u306a\u3044\u3068\u3001\u5229\u7528\u6642\u306b\u307e\u305f\u5834\u5408\u308f\u3051\u3057\u3066\u3044\u304b\u306a\u3051\u308c\u3070\u306a\u3089\u306a\u304f\u306a\u308a\u307e\u3059\u3002<br \/>\n<strong>Fatcory method<\/strong>\u3092\u4f7f\u3046\u3068\u3001\u5834\u5408\u308f\u3051\u306f\u305d\u308c\u3092\u5c02\u9580\u306b\u304a\u3053\u306a\u3046\u30b5\u30d6\u30af\u30e9\u30b9\u306e\u4e00\u7b87\u6240\u306b\u96c6\u4e2d\u3067\u304d\u308b\u306e\u3067\u3001\u904b\u7528\u4e2d\u306e\u5909\u66f4\u3067\u3042\u3063\u3066\u3082\u4ed6\u306b\u4e88\u671f\u305b\u306c\u5f71\u97ff\u304c\u767a\u751f\u3057\u3065\u3089\u304f\u306a\u308a\u307e\u3059\u3002<br \/>\n\u307e\u305f\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3055\u308c\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306f\u5171\u901a\u306eAPI\u3092\u6301\u3064\u3088\u3046\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u30af\u30e9\u30b9\u306b\u3088\u308b\u62d8\u675f\u3092\u53d7\u3051\u308b\u305f\u3081\u3001\u5229\u7528\u5074\u304b\u3089\u898b\u308b\u3068\u3001\u3069\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u3042\u3063\u3066\u3082\u4f7f\u7528\u65b9\u6cd5\u304c\u540c\u3058\u3068\u306a\u308a\u3001\u5229\u7528\u5074\u306e\u30bd\u30fc\u30b9\u306b\u624b\u3092\u52a0\u3048\u308b\u5fc5\u8981\u304c\u306a\u304f\u306a\u308a\u307e\u3059\u3002<br \/>\n\u3068\u3082\u3042\u308c\u767e\u805e\u306f\u4e00\u898b\u306b\u3057\u304b\u305a\u3002\u30af\u30e9\u30b9\u56f3\u3092\u307f\u3066\u307f\u307e\u3087\u3046\u3002<br \/>\n<a class=\"mb\" href=\"http:\/\/wb.cocolog-nifty.com\/.shared\/image.html?\/photos\/uncategorized\/2010\/07\/14\/factory_method_pattern_2.png\"><img loading=\"lazy\" decoding=\"async\" title=\"Factory_method_pattern_2\" src=\"http:\/\/wb.cocolog-nifty.com\/blog\/images\/2010\/07\/14\/factory_method_pattern_2.png\" alt=\"Factory_method_pattern_2\" width=\"300\" height=\"193\" border=\"0\" \/><\/a><br \/>\n\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3059\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u6761\u4ef6\u306b\u3088\u3063\u3066\u5834\u5408\u308f\u3051\u3059\u308b\u30b5\u30d6\u30af\u30e9\u30b9\u306f\u3001\u3053\u306e\u56f3\u306e\u5de6\u4e0b\u306e<strong>LockFactory\u30af\u30e9\u30b9<\/strong>\u3067\u3059\u3002\u3069\u3046\u3044\u3046\u30ed\u30c3\u30af(\u6392\u4ed6\u5236\u5fa1)\u3092\u63d0\u4f9b\u3059\u308b\u304b\u306f\u3001\u3053\u306eLockFactory\u30af\u30e9\u30b9\u3060\u3051\u304c\u77e5\u3063\u3066\u3044\u307e\u3059\u3002<br \/>\n\u9006\u306b\u8a00\u3048\u3070\u3001\u30ed\u30c3\u30af\u306e\u9078\u5b9a\u65b9\u6cd5\u3092\u4fee\u6b63\u3057\u305f\u3044\u5834\u5408\u306f\u3001\u3053\u3053\u3060\u3051\u624b\u3092\u52a0\u3048\u308c\u3070\u3088\u3044\u3001\u3068\u3044\u3046\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002<br \/>\n\u4e00\u65b9\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3055\u308c\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306f\u53f3\u4e0b\u306e<strong>LockFileControl\u30af\u30e9\u30b9<\/strong>(\u30d5\u30a1\u30a4\u30eb\u306b\u3088\u308b\u6392\u4ed6\u5236\u5fa1)\u3068<strong>LockPidControl\u30af\u30e9\u30b9<\/strong>(\u30d7\u30ed\u30bb\u30b9ID\u306b\u3088\u308b\u6392\u4ed6\u5236\u5fa1)\u306b\u306a\u308a\u307e\u3059\u3002\u3053\u306e\u3075\u305f\u3064\u306e\u30af\u30e9\u30b9\u306f\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u30af\u30e9\u30b9\u306e<strong>Product\u30af\u30e9\u30b9<\/strong>\u306b\u3001\u5b9f\u88c5\u3057\u306a\u3051\u308c\u3070\u306a\u3089\u306a\u3044\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306e\u62d8\u675f\u3092\u53d7\u3051\u3066\u3044\u308b\u305f\u3081\u3001\u5fc5\u7136\u7684\u306b\u5171\u901a\u306e\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9(listen()\u3001exec()\u3001close())\u304c\u5b9f\u88c5\u3055\u308c\u308b\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002<br \/>\n\u305f\u3068\u3048\u3070\u3053\u3053\u306b\u3001\u5b9f\u884c\u5c65\u6b74\u306e\u7ba1\u7406\u3082\u52a0\u3048\u305f\u3044\u304b\u3089TokyoCabinet\u3092\u5229\u7528\u3057\u3066\u6392\u4ed6\u5236\u5fa1\u3092\u304a\u3053\u306a\u304a\u3046\u3001\u3068\u3044\u3046\u4ed5\u69d8\u5909\u66f4\u304c\u767a\u751f\u3057\u3066\u3082\u3001LockTcControl\u30af\u30e9\u30b9\u306e\u3088\u3046\u306a\u3082\u306e\u3092\u65b0\u898f\u3067\u7528\u610f\u3057\u3066\u3001\u305d\u306e\u63a1\u7528\u6761\u4ef6\u3092LockFactory\u30af\u30e9\u30b9\u306b\u8ffd\u52a0\u3048\u3066\u3042\u3052\u308c\u3070\u3088\u3044\u3001\u3068\u3044\u3046\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002<br \/>\nFactory\u306f\u5de5\u5834\u3068\u3044\u3046\u610f\u5473\u306a\u306e\u3067\u3001\u3053\u3053\u3067\u306f\u300c\u306a\u306b\u3092\u3064\u304f\u308b\u304b\u300d\u3060\u3051\u306b\u8cac\u4efb\u3092\u6301\u3061\u3001\u300c\u3069\u3046\u3084\u3063\u3066\u3064\u304f\u308b\u304b\u300d\u306f\u8cac\u4efb\u7bc4\u56f2\u5916\u3067\u3059\u3002<br \/>\nProduct\u306f\u751f\u7523\u54c1\u3068\u3044\u3046\u610f\u5473\u306a\u306e\u3067\u3001\u3053\u3053\u3067\u306f\u300c\u3069\u3046\u3084\u3063\u3066\u3064\u304f\u308b\u304b\u300d\u3068\u3044\u3046\u3001\u305d\u306e\u751f\u7523\u54c1\u3092\u751f\u7523\u54c1\u305f\u3089\u3057\u3081\u3093\u69cb\u6210\u8981\u7d20\u3060\u3051\u306b\u7740\u76ee\u3057\u307e\u3059\u3002<br \/>\n\u305f\u3068\u3048\u3070\u304a\u83d3\u5b50\u5de5\u5834\u3067\u3042\u308c\u3070\u3001\u30af\u30c3\u30ad\u30fc\u3084\u30c1\u30e7\u30b3\u30ec\u30fc\u30c8\u3092\u4e26\u884c\u88fd\u9020\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u30af\u30c3\u30ad\u30fc\u3084\u30c1\u30e7\u30b3\u30ec\u30fc\u30c8\u305d\u308c\u81ea\u4f53\u306f\u81ea\u5206\u4ee5\u5916\u306b\u3069\u3093\u306a\u304a\u83d3\u5b50\u304c\u3064\u304f\u3089\u308c\u3066\u3044\u308b\u304b\u3068\u3044\u3046\u3053\u3068\u306f\u77e5\u3063\u3066\u304a\u304f\u5fc5\u8981\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u30af\u30c3\u30ad\u30fc\u306f\u30af\u30c3\u30ad\u30fc\u305f\u3089\u3057\u3081\u3093\u69cb\u6210\u8981\u7d20\u3068\u3057\u3066\u3001\u5c0f\u9ea6\u7c89\u3084\u7802\u7cd6\u306e\u542b\u6709\u7387\u3084\u4f7f\u7528\u3055\u308c\u308b\u9999\u6599\u306b\u8cac\u4efb\u3092\u6301\u3063\u3066\u3044\u308c\u3070\u3044\u3044\u308f\u3051\u3067\u3059\u3002<br \/>\n\u4e00\u65b9\u3001\u5de5\u5834\u306f\u30af\u30c3\u30ad\u30fc\u304c\u3069\u3093\u306a\u9999\u6599\u3092\u4f7f\u7528\u3055\u308c\u3066\u3044\u308b\u304b\u7ba1\u7406\u3059\u308b\u5fc5\u8981\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u30af\u30c3\u30ad\u30fc\u306e\u3064\u3082\u308a\u3067\u30c1\u30e7\u30b3\u30ec\u30fc\u30c8\u3092\u4f5c\u3089\u306a\u3044\u3088\u3046\u3001\u6761\u4ef6\u306b\u305d\u3063\u305f\u751f\u7523\u30e9\u30a4\u30f3\u3092\u7dad\u6301\u3059\u308c\u3070\u3088\u3044\u3001\u3068\u3044\u3046\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002<br \/>\n\u30af\u30c3\u30ad\u30fc\u3084\u30c1\u30e7\u30b3\u30ec\u30fc\u30c8\u306f\u3001\u4eca\u56de\u306e\u30b1\u30fc\u30b9\u3067\u3044\u3046\u3068\u3053\u308d\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u3088\u308b\u6392\u4ed6\u5236\u5fa1\u304b\u3001\u30d7\u30ed\u30bb\u30b9ID\u306b\u3088\u308b\u6392\u4ed6\u5236\u5fa1\u304b\u3001\u3068\u3044\u3046\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002\u305d\u306e\u6392\u4ed6\u5236\u5fa1\u306e\u5b9f\u73fe\u65b9\u6cd5\u306f\u305d\u308c\u305e\u308c\u306e\u30af\u30e9\u30b9\u3060\u3051\u304c\u77e5\u3063\u3066\u3044\u308c\u3070\u3044\u3044\u3053\u3068\u3067\u3059\u3002<br \/>\n\u4e00\u65b9\u3001\u5834\u5408\u308f\u3051\u30af\u30e9\u30b9\u306f\u5de5\u5834\u3068\u3057\u3066\u3001\u305d\u306e\u74b0\u5883\u6761\u4ef6\u306b\u5408\u81f4\u3057\u305f\u6392\u4ed6\u5236\u5fa1\u3092\u63d0\u4f9b\u3057\u3066\u3042\u3052\u308c\u3070\u3088\u3044\u3001\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u3002<br \/>\n\u3053\u3046\u3057\u3066\u304a\u4e92\u3044\u306e\u8cac\u4efb\u7bc4\u56f2\u3092\u660e\u78ba\u306b\u3057\u3066\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u5206\u3051\u308b\u3053\u3068\u3067\u3001\u4f9d\u5b58\u95a2\u4fc2\u304c\u7de9\u304f\u306a\u308a(\u758e\u7d50\u5408)\u3001\u6539\u4fee\u3084\u6a5f\u80fd\u62e1\u5f35\u306b\u5f37\u3044\u4ed5\u7d44\u307f\u306b\u306a\u308a\u307e\u3059\u3002<br \/>\n\u3053\u3046\u3057\u305f\u4ed5\u7d44\u307f\u3067\u3064\u304f\u3089\u308c\u305f\u30b7\u30b9\u30c6\u30e0\u3092\u3001\u5805\u7262\u6027\u306e\u9ad8\u3044\u30b7\u30b9\u30c6\u30e0\u3068\u547c\u3073\u3001\u9867\u5ba2\u3084\u30a8\u30f3\u30c9\u30e6\u30fc\u30b6\u3001\u3057\u3044\u3066\u306f\u958b\u767a\u8005\u3092\u5e78\u305b\u306b\u3057\u3066\u3044\u304d\u307e\u3059\u3002<br \/>\n\u9577\u304f\u306a\u308a\u307e\u3057\u305f\u3002<br \/>\n\u3055\u3063\u305d\u304f\u5b9f\u969b\u306e\u30b3\u30fc\u30c9\u3092\u307f\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u4f8b\u306b\u3088\u3063\u3066php\u3068ruby\u3067\u5b9f\u88c5\u3057\u3066\u3044\u307e\u3059\u3002<br \/>\n\u307e\u305aphp\u3067\u3059\u3002<br \/>\nFactory.class.php (<strong>Factory\u30af\u30e9\u30b9<\/strong>)<\/p>\n<pre class=\"linux\" style=\"border: 1px solid gray; background-color: #000000; padding: 4px 2px 2px 6px; color: #ffffff; line-height: 1em;\">&lt;?php\r\nAbstract class Factory\r\n{\r\npublic final function create(Array $argv) {\r\nreturn $this-&gt;createProduct($argv);\r\n}\r\nprotected abstract function createProduct(Array $argv);\r\n}\r\n<\/pre>\n<p>LockFactory.class.php (<strong>LockFactory\u30af\u30e9\u30b9<\/strong>)<\/p>\n<pre class=\"linux\" style=\"border: 1px solid gray; background-color: #000000; padding: 4px 2px 2px 6px; color: #ffffff; line-height: 1em;\">&lt;?php\r\nClass LockFactory extends Factory\r\n{\r\nconst FILE_MODE = 1;\r\nconst PID_MODE = 2;\r\nprotected function createProduct(Array $argv) {\r\n$mode = 1;\r\nif (isset($argv[1]) &amp;&amp; intval($argv[1]) &gt; 0) {\r\n$mode = intval($argv[1]);\r\n}\r\nswitch ($mode) {\r\ncase self::FILE_MODE:\r\n$lock = new LockFileControl($argv[0]);\r\nbreak;\r\ncase self::PID_MODE:\r\n$lock = new LockPidControl($argv[0]);\r\nbreak;\r\ndefault:\r\necho \"invalid mode: ${mode}\\n\";\r\nexit;\r\n}\r\nreturn $lock;\r\n}\r\n}\r\n<\/pre>\n<p>Product.class.php (<strong>Product\u30af\u30e9\u30b9<\/strong>)<\/p>\n<pre class=\"linux\" style=\"border: 1px solid gray; background-color: #000000; padding: 4px 2px 2px 6px; color: #ffffff; line-height: 1em;\">&lt;?php\r\nInterface Product\r\n{\r\npublic function listen();\r\npublic function exec();\r\npublic function close();\r\n}\r\n<\/pre>\n<p>LockFileControl.class.php (<strong>LockFileControl\u30af\u30e9\u30b9<\/strong>)<\/p>\n<pre class=\"linux\" style=\"border: 1px solid gray; background-color: #000000; padding: 4px 2px 2px 6px; color: #ffffff; line-height: 1em;\">&lt;?php\r\nClass LockFileException extends Exception {}\r\nClass LockFileControl implements Product\r\n{\r\nconst LIMIT_TERM = 10;\r\nprivate $_file = null;\r\nprivate $_limit_term = null;\r\npublic function __construct($file, $limit_term = null) {\r\n$this-&gt;_file = $file . '.lock';\r\n$this-&gt;_limit_term = $limit_term ? $limit_term : self::LIMIT_TERM;\r\n}\r\npublic function listen() {\r\nif (($work_time = $this-&gt;_getWorkTime()) !== false) {\r\nif ($work_time &gt; $this-&gt;_limit_term) {\r\ntry {\r\n$ret = $this-&gt;close();\r\n} catch (LockFileException $e) {\r\nthrow new LockFileException('deadlock: ' . $e-&gt;getMessage());\r\n}\r\nif (! $ret) {\r\nthrow new LockFileException('deadlock: ' . $this-&gt;_file);\r\n}\r\nreturn false;\r\n}\r\n}\r\nreturn (bool)$work_time;\r\n}\r\npublic function exec() {\r\n$ret = touch($this-&gt;_file);\r\nif (! $ret) {\r\nthrow new LockFileException('failed to lock: ' . $this-&gt;_file);\r\n}\r\nreturn true;\r\n}\r\npublic function close() {\r\n$ret = unlink($this-&gt;_file);\r\nif (! $ret) {\r\nthrow new LockFileException('failed to unlock: ' . $this-&gt;_file);\r\n}\r\nreturn true;\r\n}\r\nprivate function _getWorkTime() {\r\nclearstatcache();\r\nif (! is_file($this-&gt;_file)) {\r\nreturn false;\r\n}\r\nreturn time() - filemtime($this-&gt;_file);\r\n}\r\n}\r\n<\/pre>\n<p>LockPidControl.class.php (<strong>LockPidControl\u30af\u30e9\u30b9<\/strong>)<\/p>\n<pre class=\"linux\" style=\"border: 1px solid gray; background-color: #000000; padding: 4px 2px 2px 6px; color: #ffffff; line-height: 1em;\">&lt;?php\r\nClass LockPidException extends Exception {}\r\nClass LockPidControl implements Product\r\n{\r\nconst LIMIT_TERM = 10;\r\nprivate $_pname = null;\r\nprivate $_limit_term = null;\r\nprivate $_pid = null;\r\npublic function __construct($pname, $limit_term = null) {\r\n$this-&gt;_pname = $pname;\r\n$this-&gt;_limit_term = $limit_term ? $limit_term : self::LIMIT_TERM;\r\n}\r\npublic function listen() {\r\nif (($work_time = $this-&gt;_getWorkTime()) !== false) {\r\nif ($work_time &gt; $this-&gt;_limit_term) {\r\nexec(\"kill -KILL \" . $this-&gt;_pid);\r\nif ($this-&gt;_getWorkTime()) {\r\nthrow new LockFileException('deadlock: ' . $this-&gt;_pid);\r\n}\r\nreturn false;\r\n}\r\n}\r\nreturn (bool)$work_time;\r\n}\r\npublic function exec() {\r\nreturn true;\r\n}\r\npublic function close() {\r\nreturn true;\r\n}\r\nprivate function _getWorkTime() {\r\n$cmd = \"ps x | grep \" . $this-&gt;_pname . \" | grep -v grep | awk '{print \\$1}'\";\r\nexec($cmd, $pids);\r\nif (count($pids) == 1 &amp;&amp; intval($pids[0]) == getmypid()) {\r\nreturn false;\r\n}\r\n$pids = array_diff($pids, array(getmypid()));\r\n$this-&gt;_pid = intval(array_shift($pids));\r\nreturn time() - filemtime('\/proc\/' . $this-&gt;_pid);\r\n}\r\n}\r\n<\/pre>\n<p>factory_method_client.php (\u5229\u7528\u5074)<\/p>\n<pre class=\"linux\" style=\"border: 1px solid gray; background-color: #000000; padding: 4px 2px 2px 6px; color: #ffffff; line-height: 1em;\">&lt;?php\r\nrequire 'Factory.class.php';\r\nrequire 'LockFactory.class.php';\r\nrequire 'Product.class.php';\r\nrequire 'LockFileControl.class.php';\r\nrequire 'LockPidControl.class.php';\r\n$factory = new LockFactory();\r\n$lock = $factory-&gt;create($argv);\r\ntry {\r\nif ($lock-&gt;listen()) {\r\necho \"quit executing!\\n\";\r\nexit;\r\n}\r\nif ($lock-&gt;exec()) {\r\necho \"start working...\\n\";\r\n#job some\r\nsleep(5);\r\n}\r\nif ($lock-&gt;close()) {\r\necho \"...end working\\n\";\r\n}\r\n} catch (Exception $e) {\r\necho $e-&gt;getMessage() . \"\\n\";\r\n}\r\n<\/pre>\n<p>php\u306f\u4ee5\u4e0a\u3067\u3059\u3002<br \/>\n\u6b21\u306bruby\u3092\u898b\u3066\u307f\u307e\u3057\u3087\u3046\u3002<br \/>\nFactory.class.rb (<strong>Factory\u30af\u30e9\u30b9<\/strong>)<\/p>\n<pre class=\"linux\" style=\"border: 1px solid gray; background-color: #000000; padding: 4px 2px 2px 6px; color: #ffffff; line-height: 1em;\">class NotImplements &lt; Exception;end\r\nclass Factory\r\ndef create(argv)\r\ncreateProduct(argv)\r\nend\r\ndef createProduct(argv)\r\nraise NotImplements\r\nend\r\nprotected :createProduct\r\nend\r\n<\/pre>\n<p>LockFactory.class.rb (<strong>LockFactory\u30af\u30e9\u30b9<\/strong>)<\/p>\n<pre class=\"linux\" style=\"border: 1px solid gray; background-color: #000000; padding: 4px 2px 2px 6px; color: #ffffff; line-height: 1em;\">class LockFactory &lt; Factory\r\nFILE_MODE = 1\r\nPID_MODE = 2\r\ndef createProduct(argv)\r\nmode = 1\r\nmode = argv[1].to_i if argv[1].to_i &gt; 0\r\ncase mode\r\nwhen FILE_MODE\r\nlock = LockFileControl.new(argv[0])\r\nwhen PID_MODE\r\nlock = LockPidControl.new(argv[0])\r\nelse\r\nprint \"invalid mode: #{mode}\\n\"\r\nexit\r\nend\r\nlock\r\nend\r\nprotected :createProduct\r\nend\r\n<\/pre>\n<p>Product.class.rb (<strong>Product\u30af\u30e9\u30b9<\/strong>)<\/p>\n<pre class=\"linux\" style=\"border: 1px solid gray; background-color: #000000; padding: 4px 2px 2px 6px; color: #ffffff; line-height: 1em;\">class NotImplements &lt; Exception;end\r\nmodule Product\r\ndef listen\r\nraise NotImplements\r\nend\r\ndef exec\r\nraise NotImplements\r\nend\r\ndef close\r\nraise NotImplements\r\nend\r\nend\r\n<\/pre>\n<p>LockFileControl.class.rb (<strong>LockFileControl\u30af\u30e9\u30b9<\/strong>)<\/p>\n<pre class=\"linux\" style=\"border: 1px solid gray; background-color: #000000; padding: 4px 2px 2px 6px; color: #ffffff; line-height: 1em;\">class LockFileException &lt; Exception;end\r\nclass LockFileControl\r\ninclude Product\r\nLIMIT_TERM = 10\r\ndef initialize(file, limit_term = nil)\r\n@_file = file + '.lock'\r\n@_limit_term = limit_term ? limit_term : LIMIT_TERM\r\nend\r\ndef listen\r\nif (work_time = getWorkTime) != false\r\nif work_time &gt; @_limit_term\r\nbegin\r\nret = close\r\nrescue\r\nraise \"deadlock: #{$!}\"\r\nend\r\nunless ret\r\nraise \"deadlock: #{@_file}\"\r\nend\r\nreturn false\r\nend\r\nend\r\nreturn false if work_time == 0 || work_time == false\r\ntrue\r\nend\r\ndef exec\r\nbegin\r\nFile.open(@_file, 'w').close\r\nrescue\r\nraise \"failed to lock: #{@_file}\"\r\nend\r\ntrue\r\nend\r\ndef close\r\nbegin\r\nFile.unlink(@_file)\r\nrescue\r\nraise \"failed to unlock: #{@_file}\"\r\nend\r\ntrue\r\nend\r\ndef getWorkTime\r\nreturn false unless File.exist?(@_file)\r\nTime.now.to_i - File.mtime(@_file).to_i\r\nend\r\nprivate :getWorkTime\r\nend\r\n<\/pre>\n<p>LockPidControl.class.rb (<strong>LockPidControl\u30af\u30e9\u30b9<\/strong>)<\/p>\n<pre class=\"linux\" style=\"border: 1px solid gray; background-color: #000000; padding: 4px 2px 2px 6px; color: #ffffff; line-height: 1em;\">class LockPidException &lt; Exception;end\r\nclass LockPidControl\r\ninclude Product\r\nLIMIT_TERM = 10\r\ndef initialize(pname, limit_term = nil)\r\n@_pname = pname\r\n@_limit_term = limit_term ? limit_term : LIMIT_TERM\r\n@_pid = nil\r\nend\r\ndef listen\r\nif (work_time = getWorkTime) != false\r\nif work_time &gt; @_limit_term\r\n`kill -KILL #{@_pid}`\r\nraise \"deadlock: #{@_pid}\" if getWorkTime\r\nreturn false\r\nend\r\nend\r\nreturn false if work_time == 0 || work_time == false\r\ntrue\r\nend\r\ndef exec\r\ntrue\r\nend\r\ndef close\r\ntrue\r\nend\r\ndef getWorkTime\r\nret = `ps x | grep #{@_pname} | grep -v grep | awk '{print \\$1}'`\r\npids = ret.split\r\nreturn false if pids.size == 1 &amp;&amp; pids[0].to_i == $$\r\npids = pids - [$$]\r\n@_pid = pids.shift\r\nTime.now.to_i - File.mtime(\"\/proc\/#{@_pid}\").to_i\r\nend\r\nprivate :getWorkTime\r\nend\r\n<\/pre>\n<p>factory_method_client.rb (\u5229\u7528\u5074)<\/p>\n<pre class=\"linux\" style=\"border: 1px solid gray; background-color: #000000; padding: 4px 2px 2px 6px; color: #ffffff; line-height: 1em;\">require 'Factory.class.rb'\r\nrequire 'LockFactory.class.rb'\r\nrequire 'Product.class.rb'\r\nrequire 'LockFileControl.class.rb'\r\nrequire 'LockPidControl.class.rb'\r\nfactory = LockFactory.new\r\nlock = factory.create(ARGV.unshift(__FILE__))\r\nbegin\r\nif lock.listen\r\nprint \"quit excuting!\\n\"\r\nexit\r\nend\r\nif lock.exec\r\nprint \"start working...\\n\"\r\n#job some\r\nsleep 5\r\nend\r\nif lock.close\r\nprint \"...end working\\n\"\r\nend\r\nrescue\r\nprint \"#{$!}\\n\"\r\nexit\r\nend\r\n<\/pre>\n<p>ruby \u306f\u4ee5\u4e0a\u3067\u3059\u3002<br \/>\n\u6392\u4ed6\u5236\u5fa1\u306e\u65b9\u6cd5\u3092\u9078\u5b9a\u3059\u308b\u74b0\u5883\u6761\u4ef6\u306f\u3001\u3053\u3053\u3067\u306f\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u306b\u4e0e\u3048\u305f\u5f15\u6570\u3068\u3057\u3066\u3044\u307e\u3059\u3002<strong>1<\/strong>\u3067\u30d5\u30a1\u30a4\u30eb\u306b\u3088\u308b\u6392\u4ed6\u5236\u5fa1\u3001<strong>2<\/strong>\u3067\u30d7\u30ed\u30bb\u30b9ID\u306b\u3088\u308b\u6392\u4ed6\u5236\u5fa1\u3067\u3059\u3002<br \/>\n\u4e00\u5ea6\u5b9f\u884c\u3059\u308b\u3068\u3001\u3053\u306e\u30d0\u30c3\u30c1\u51e6\u7406\u306f\u5b9f\u884c\u6642\u9593\u306b5\u79d2\u3092\u8981\u3057\u307e\u3059\u3002\u305d\u306e\u3042\u3044\u3060\u306e\u591a\u91cd\u5b9f\u884c\u306f\u6392\u4ed6\u5236\u5fa1\u306b\u3088\u308a\u9632\u6b62\u3055\u308c\u307e\u3059\u3002\u30c7\u30c3\u30c9\u30ed\u30c3\u30af\u5224\u5b9a\u306f10\u79d2\u3067\u3059\u3002<br \/>\nphp\u306e\u5b9f\u884c\u7d50\u679c: (ruby\u3082\u7d50\u679c\u306f\u4e00\u7dd2)<\/p>\n<pre class=\"linux\" style=\"border: 1px solid gray; background-color: #000000; padding: 4px 2px 2px 6px; color: #ffffff; line-height: 1em;\">php .\/factory_method_client.php 1 &amp;\r\n[1] 22747\r\nstart working...\r\nphp .\/factory_method_client.php 1 &amp;\r\n[2] 22748\r\nquit executing!\r\n[2]+  Done                    php .\/factory_method_client.php 1\r\n...end working\r\n[1]+  Done                    php .\/factory_method_client.php 1\r\nphp .\/factory_method_client.php 2 &amp;\r\n[1] 22750\r\nstart working...\r\nphp .\/factory_method_client.php 2 &amp;\r\n[2] 22756\r\nquit executing!\r\n[2]+  Done                    php .\/factory_method_client.php 2\r\n...end working\r\n[1]+  Done                    php .\/factory_method_client.php 2\r\n<\/pre>\n<p>\u307e\u3068\u3081:<br \/>\n\u305d\u3057\u3066ruby\u3063\u3066abstract\u3068\u304bfinal\u3068\u304b\u306e\u4fee\u98fe\u5b50\u3063\u3066\u4f7f\u3048\u306a\u3044\u3093\u3067\u3057\u3087\u3046\u304b\u3002\u3061\u3087\u3063\u3068\u8abf\u3079\u3066\u3082\u3088\u304f\u5206\u304b\u3089\u306a\u304b\u3063\u305f\u306e\u3067\u30b9\u30eb\u30fc\u3057\u307e\u3057\u305f\u3002\u30a2\u30b8\u30e3\u30a4\u30eb\u958b\u767a\u5411\u3051\u3068\u3044\u3046\u3053\u3068\u3067\u50d5\u81ea\u8eab\u3082\u30a2\u30b8\u30e3\u30a4\u30eb\u306b(\u7b11)\u3002<br \/>\n\u3042\u3068\u3001\u958b\u767a\u6642\u306b\u30b7\u30b9\u30c6\u30e0\u8981\u4ef6\u3063\u3066\u6c7a\u307e\u3063\u3066\u308b\u3068\u601d\u3046\u306e\u3067\u3001\u3042\u3093\u307e\u308a\u3053\u3046\u3044\u3046\u4f8b\u306e\u3088\u3046\u306a\u4f7f\u3044\u65b9\u3057\u306a\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u306d\u3002\u3067\u3082\u81ea\u5206\u306e\u3064\u304f\u3063\u305f\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u3044\u308d\u3093\u306a\u958b\u767a\u6848\u4ef6\u3067\u4f7f\u3044\u307e\u308f\u3057\u3066\u958b\u767a\u30b3\u30b9\u30c8\u3092\u3055\u3052\u308b\u3001\u3068\u3044\u3046\u610f\u5473\u3067\u306f\u6709\u52b9\u3060\u3068\u601d\u3044\u307e\u3059\u3002\u30d5\u30a1\u30a4\u30eb\u306b\u3088\u308b\u6392\u4ed6\u5236\u5fa1\u3057\u304b\u4f7f\u308f\u306a\u3044\u306a\u3089\u3001LockFactory\u30af\u30e9\u30b9\u306e\u6761\u4ef6\u5206\u5c90\u3092\u56fa\u5b9a\u3057\u3066\u3057\u307e\u3048\u3070\u3044\u3044\u308f\u3051\u3067\u3059\u304b\u3089\u3002<br \/>\n\u6392\u4ed6\u5236\u5fa1\u3060\u3051\u3067\u306a\u304f\u3001\u4ed6\u306b\u3082\u8907\u6570\u306e\u8aad\u307f\u8fbc\u3080\u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f\u306b\u3088\u308b\u9055\u3044\u3001\u8907\u6570\u306eHTTP\u901a\u4fe1\u5148\u306b\u3088\u308b\u9055\u3044\u3001\u8907\u6570\u306e\u8ab2\u91d1API\u306b\u3088\u308b\u9055\u3044\u3001\u306a\u3069\u3067\u52a0\u5de5\u65b9\u6cd5\u304c\u5206\u304b\u308c\u308b\u3088\u3046\u306a\u5834\u5408\u306b\u3082\u3053\u306e\u30d1\u30bf\u30fc\u30f3\u304c\u4f7f\u3048\u307e\u3059\u3002<br \/>\n\u67d0ISP\u306e\u57fa\u5e79\u30b7\u30b9\u30c6\u30e0\u3067\u3082\u3053\u308c\u304c\u4f7f\u308f\u308c\u3066\u3044\u307e\u3057\u305f\u304c\u3001\u30d1\u30bf\u30fc\u30f3\u3092\u77e5\u3063\u3066\u3044\u308b\u3068\u6697\u9ed9\u306e\u5171\u901a\u8a9e\u3068\u3057\u3066\u6a5f\u80fd\u3059\u308b\u306e\u3067\u89e3\u6790\u3084\u30bd\u30fc\u30b9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0\u306e\u52a9\u3051\u821f\u306b\u3082\u306a\u3063\u3066\u304f\u308c\u307e\u3059\u306d(^^)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u30c7\u30b6\u30a4\u30f3\u30d1\u30bf\u30fc\u30f3\u306eFactory method\u306f\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3059\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u30b5\u30d6\u30af\u30e9\u30b9\u304c\u6c7a\u3081\u307e\u3059\u3002\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3055\u308c\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306f\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u30af\u30e9\u30b9\u306b\u3088\u308aI\/F\u3092\u898f\u5b9a\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u5171\u901a\u306eAPI\u304c\u5b9f\u88c5\u3055\u308c\u307e\u3059\u3002 <a class=\"moretag read-more-link\" href=\"https:\/\/ketoha.co.jp\/blog\/?p=118\">&#133;<\/a><\/p>\n","protected":false},"author":1,"featured_media":119,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":{"0":"entry","1":"post","2":"publish","3":"author-ketoher","4":"post-118","6":"format-standard","7":"has-post-thumbnail","8":"category-tech"},"_links":{"self":[{"href":"https:\/\/ketoha.co.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/118","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ketoha.co.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ketoha.co.jp\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ketoha.co.jp\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ketoha.co.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=118"}],"version-history":[{"count":1,"href":"https:\/\/ketoha.co.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/118\/revisions"}],"predecessor-version":[{"id":156,"href":"https:\/\/ketoha.co.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/118\/revisions\/156"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ketoha.co.jp\/blog\/index.php?rest_route=\/wp\/v2\/media\/119"}],"wp:attachment":[{"href":"https:\/\/ketoha.co.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=118"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ketoha.co.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=118"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ketoha.co.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=118"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}