{"id":10516,"date":"2020-10-18T12:06:08","date_gmt":"2020-10-18T03:06:08","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=10516"},"modified":"2020-10-25T09:19:42","modified_gmt":"2020-10-25T00:19:42","slug":"abstract-factory-%ed%8c%a8%ed%84%b4","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=10516","title":{"rendered":"[GoF] Abstract Factory \ud328\ud134"},"content":{"rendered":"<h4>\ud328\ud134\uba85\uce6d<\/h4>\n<p>Abstract Factory<\/p>\n<h4>\ud544\uc694\ud55c \uc0c1\ud669<\/h4>\n<p>\uc5b4\ub5a4 \uae30\ub2a5 \ub610\ub294 \ucd9c\ub825\uacb0\uacfc\ub97c \uc0dd\uc131\ud560\ub54c \uadf8 \uae30\ub2a5 \ub610\ub294 \ucd9c\ub825\uacb0\uacfc\ub97c \uad6c\uc131\ud558\ub294 \uac01\uac01\uc758 \uc694\uc18c\ub97c \uc0dd\uc131\ud558\ub294 \ubc29\ubc95\uc744 \ucd94\uc0c1\ud654\ud560 \uc218 \uc788\ub294 \ud328\ud134\uc774\ub2e4.<\/p>\n<h4>\uc608\uc81c \ucf54\ub4dc<\/h4>\n<p><img decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2020\/10\/abstractfacotry.png\" alt=\"\" width=\"900\"  class=\"aligncenter size-full wp-image-10517\" \/><\/p>\n<p>Factory\ub294 \uc5b4\ub5a4 \uae30\ub2a5\uc774\ub098 \ucd9c\ub825\uacb0\uacfc\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud574 \uad6c\uc131\ub418\ub294 \uac01\uac01\uc758 \uc694\uc18c\ub97c \uc0dd\uc131\ud558\ub294 \uad6c\uccb4\uc801\uc778 \ud074\ub798\uc2ac\ub974 \uc0dd\uc131\ud558\ub294 \ud074\ub798\uc2a4\uc774\ub2e4. Member\uc640 Club \uadf8\ub9ac\uace0 Page\uac00 \uac01\uac01\uc758 \uc694\uc18c\uc5d0 \ub300\ud55c \ucd94\uc0c1 \ud074\ub798\uc2a4\uc774\ub2e4. Item \ucd94\uc0c1 \ud074\ub798\uc2a4\ub294 Member\uc640 Club\uc744 \uac19\uc740 \uac1c\ub150\uc73c\ub85c \ub2e4\ub8e8\uae30 \uc704\ud574 \uc874\uc7ac\ud55c\ub2e4. \uc2e4\uc81c \uae30\ub2a5 \ub610\ub294 \ucd9c\ub825\uacb0\uacfc\ub97c \uc0dd\uc131\ud558\ub294 \uad6c\uccb4 \ud074\ub798\uc2a4\ub294 HtmlMember, HtmlClub, htmlPage \uadf8\ub9ac\uace0 HtmlFactory\uc774\ub2e4.<\/p>\n<p>Factory \ud074\ub798\uc2a4\ub97c \uba3c\uc800 \ubcf4\uc790<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic abstract class Factory {\r\n\tpublic abstract Member createMember(String name, String duty, String email);\r\n\tpublic abstract Club createClub(String title);\r\n\tpublic abstract Page createPage(String title, String footer);\r\n}\r\n<\/pre>\n<p>Factory \ud074\ub798\uc2a4\ub294 Member, Club, Page \uac1d\uccb4\ub97c \uc0dd\uc131\ud55c\ub2e4. Member\uc640 Club\uc740 \ub3d9\uc77c\ud55c \uac1c\ub150\uc73c\ub85c \ucde8\uae09\ub418\uae30 \uc704\ud574 Item\uc774\ub77c\ub294 \ucd94\uc0c1\ud074\ub798\uc2a4\ub97c \uc0c1\uc18d\ubc1b\ub294\ub370 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic abstract class Item {\r\n\tprotected String name;\r\n\t\r\n\tpublic Item(String name) {\r\n\t\tthis.name = name;\r\n\t}\r\n\t\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\t\r\n\tpublic abstract String getResult();\r\n}\r\n<\/pre>\n<p>\uc774 Item \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d\ubc1b\ub294 Member \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic abstract class Member extends Item {\r\n\tprivate String duty;\r\n\tprivate String email;\r\n\t\r\n\tpublic Member(String name, String duty, String email) {\r\n\t\tsuper(name);\r\n\t\tthis.duty = duty;\r\n\t\tthis.email = email;\r\n\t}\r\n\t\r\n\tpublic String getDuty() {\r\n\t\treturn duty;\r\n\t}\r\n\t\r\n\tpublic String getEmail() {\r\n\t\treturn email;\r\n\t}\r\n}\r\n<\/pre>\n<p>Item\uc744 \uc0c1\uc18d\ubc1b\ub294 Club \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Iterator;\r\n\r\npublic abstract class Club extends Item {\r\n\tprivate ArrayList&lt;Item> items = new ArrayList&lt;Item>();\r\n\tpublic Club(String name) {\r\n\t\tsuper(name);\r\n\t}\r\n\t\r\n\tpublic void add(Item item) {\r\n\t\titems.add(item);\r\n\t}\r\n\r\n\tpublic Iterator<Item> getIterator() {\r\n\t\treturn items.iterator();\r\n\t}\r\n}\r\n<\/pre>\n<p>Page \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Iterator;\r\n\r\npublic abstract class Page {\r\n\tprivate String title;\r\n\tprivate String footer;\t\r\n\tprivate ArrayList&lt;Item> items = new ArrayList&lt;Item>();\r\n\t\r\n\tpublic Page(String title, String footer) {\r\n\t\tthis.title = title;\r\n\t\tthis.footer = footer;\r\n\t}\r\n\t\r\n\tpublic void add(Item item) {\r\n\t\titems.add(item);\r\n\t}\r\n\t\r\n\tpublic String getTitle() {\r\n\t\treturn this.title;\r\n\t}\r\n\t\r\n\tpublic String getFooter() {\r\n\t\treturn this.footer;\r\n\t}\r\n\t\r\n\tpublic Iterator<Item> getIterator() {\r\n\t\treturn items.iterator();\r\n\t}\r\n\t\r\n\tpublic abstract String getResult();\r\n}\r\n<\/pre>\n<p>\uc774\uc81c \uad6c\uccb4\uc801\uc778 \ubd80\ud488\uc5d0 \ud574\ub2f9\ud558\ub294 \ud074\ub798\uc2a4\ub4e4\uc744 \uc0b4\ud3b4\ubcf4\uc790. \uba3c\uc800 Member\uc758 \ud30c\uc0dd \ud074\ub798\uc2a4\uc778 HtmlMember\uc774\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class HtmlMember extends Member {\r\n\r\n\tpublic HtmlMember(String name, String duty, String email) {\r\n\t\tsuper(name, duty, email);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String getResult() {\r\n\t\tStringBuilder sb = new StringBuilder();\r\n\t\t\r\n\t\tsb.append(\"<ul>\");\r\n\t\tsb.append(\"<li>Name: \");\r\n\t\tsb.append(this.getName());\r\n\t\tsb.append(\"<\/li>\");\r\n\t\tsb.append(\"<ul>\");\r\n\t\tsb.append(\"<li>Duty: \");\r\n\t\tsb.append(this.getDuty());\r\n\t\tsb.append(\"<\/li>\");\r\n\t\tsb.append(\"<li>Email: \");\r\n\t\tsb.append(this.getEmail());\r\n\t\tsb.append(\"<\/li>\");\r\n\t\tsb.append(\"<\/ul>\");\r\n\t\tsb.append(\"<\/ul>\");\r\n\t\t\r\n\t\treturn sb.toString();\r\n\t}\r\n}\r\n<\/pre>\n<p>\ub2e4\uc74c\uc740 Club\uc758 \ud30c\uc0dd \ud074\ub798\uc2a4\uc778 HtmlClub\uc774\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\nimport java.util.Iterator;\r\n\r\npublic class HtmlClub extends Club {\r\n\tpublic HtmlClub(String name) {\r\n\t\tsuper(name);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String getResult() {\r\n\t\tStringBuilder sb = new StringBuilder();\r\n\t\t\r\n\t\tsb.append(\"<ul>\");\r\n\t\tsb.append(\"<li>Club Name: \");\r\n\t\tsb.append(getName());\r\n\t\tsb.append(\"<\/li>\");\r\n\t\tIterator<Item> iter = getIterator();\r\n\t\twhile(iter.hasNext()) {\r\n\t\t\tItem item = iter.next();\r\n\t\t\tsb.append(item.getResult());\r\n\t\t}\r\n\t\tsb.append(\"<\/ul>\");\r\n\t\t\r\n\t\treturn sb.toString();\r\n\t}\r\n}\r\n<\/pre>\n<p>\ub2e4\uc74c\uc740 Page\uc758 \ud30c\uc0dd \ud074\ub798\uc2a4\uc778 HtmlPage\uc774\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\nimport java.util.Iterator;\r\n\r\npublic class HtmlPage extends Page {\r\n\tpublic HtmlPage(String title, String footer) {\r\n\t\tsuper(title, footer);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String getResult() {\r\n\t\tStringBuilder sb = new StringBuilder();\r\n\t\t\r\n\t\tsb.append(\"<body>\");\r\n\t\tsb.append(\"<h3>\");\r\n\t\tsb.append(getTitle());\r\n\t\tsb.append(\"<\/h3>\");\r\n\t\t\r\n\t\tIterator<Item> iter = getIterator();\r\n\t\twhile(iter.hasNext()) {\r\n\t\t\tItem item = iter.next();\r\n\t\t\tsb.append(item.getResult());\r\n\t\t}\r\n\t\t\r\n\t\tsb.append(\"<hr>\");\r\n\t\tsb.append(\"<span>\");\r\n\t\tsb.append(getFooter());\r\n\t\tsb.append(\"<\/span>\");\r\n\t\t\r\n\t\tsb.append(\"<\/body>\");\r\n\t\t\r\n\t\treturn sb.toString();\r\n\t}\t\r\n}\r\n<\/pre>\n<p>\ub2e4\uc74c\uc740 Factory\uc758 \ud30c\uc0dd \ud074\ub798\uc2a4\uc778 HtmlFactory\uc774\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class HtmlFactory extends Factory {\r\n\r\n\t@Override\r\n\tpublic Member createMember(String name, String duty, String email) {\r\n\t\treturn new HtmlMember(name, duty, email);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic Club createClub(String title) {\r\n\t\treturn new HtmlClub(title);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic Page createPage(String title, String footer) {\r\n\t\treturn new HtmlPage(title, footer);\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc9c0\uae08\uae4c\uc9c0\uc758 \ud074\ub798\uc2a4\ub4e4\uc744 \uc0ac\uc6a9\ud558\ub294 \uc608\uc81c \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class Main {\r\n\tpublic static void main(String[] args) {\r\n\t\tPage page = new HtmlPage(\"OrangeTree\", \"since 2021\");\r\n\t\tFactory factory = new HtmlFactory();\r\n\t\t\r\n\t\tMember ceo = factory.createMember(\"Jany\", \"CEO\", \"jany@orangetree.com\");\r\n\t\tpage.add(ceo);\r\n\t\t\r\n\t\tClub club1 = factory.createClub(\"GAME\");\r\n\t\tMember mem1_club1 = factory.createMember(\"Toms\", \"Manager\", \"toms@orangetree.com\");\r\n\t\tMember mem2_club1 = factory.createMember(\"Sujin\", \"Assist\", \"sujin@orangetree.com\");\r\n\t\t\r\n\t\tclub1.add(mem1_club1);\r\n\t\tclub1.add(mem2_club1);\r\n\t\tpage.add(club1);\r\n\t\t\r\n\t\tClub club2 = factory.createClub(\"STUDY\");\r\n\t\tMember mem1_club2 = factory.createMember(\"Jack\", \"Manager\", \"jack@orangetree.com\");\r\n\t\tMember mem2_club2 = factory.createMember(\"Robert\", \"Assist\", \"robert@orangetree.com\");\r\n\t\tclub2.add(mem1_club2);\r\n\t\tclub2.add(mem2_club2);\r\n\t\tpage.add(club2);\r\n\r\n\t\tSystem.out.println(page.getResult());\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc2e4\ud589 \uacb0\uacfc\ub294 HTML \ucd9c\ub825\uc778\ub370, \uc774\ub97c \uc6f9\ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2020\/10\/abstractfactory2.png\" alt=\"\" width=\"800\" class=\"aligncenter size-full wp-image-10519\" \/><\/p>\n<div style='background:#efefef;border-radius:8px;padding:12px 24px'>\uc774 \uae00\uc740 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc124\uacc4\uc758 \uae30\ubc18\uc774 \ub418\ub294 GoF\uc758 \ub514\uc790\uc778\ud328\ud134\uc5d0 \ub300\ud55c \uac15\uc758\uc790\ub8cc\uc785\ub2c8\ub2e4. \uc644\uc804\ud55c \uc2e4\uc2b5\uc744 \uc704\ud574 \uc774 \uae00\uc5d0\uc11c \uc18c\uac1c\ud558\ub294 \ud074\ub798\uc2a4 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uacfc \uc608\uc81c \ucf54\ub4dc\ub294 \uc644\uc804\ud558\uac8c \uc2e4\ud589\ub418\ub3c4\ub85d \uc81c\uacf5\ub418\uc9c0\ub9cc, \uc0c1\ub300\uc801\uc73c\ub85c \uc608\uc81c \ucf54\ub4dc\uc640 \uad00\ub828\ub41c \uc124\uba85\uc774 \ud568\ucd95\uc801\uc73c\ub85c \uc81c\uacf5\ub418\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc5d0 \ub300\ud574 \uad81\uae08\ud55c \uc810\uc774 \uc788\uc73c\uba74 \ub313\uae00\uc744 \ud1b5\ud574 \ub0a8\uaca8\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\ud328\ud134\uba85\uce6d Abstract Factory \ud544\uc694\ud55c \uc0c1\ud669 \uc5b4\ub5a4 \uae30\ub2a5 \ub610\ub294 \ucd9c\ub825\uacb0\uacfc\ub97c \uc0dd\uc131\ud560\ub54c \uadf8 \uae30\ub2a5 \ub610\ub294 \ucd9c\ub825\uacb0\uacfc\ub97c \uad6c\uc131\ud558\ub294 \uac01\uac01\uc758 \uc694\uc18c\ub97c \uc0dd\uc131\ud558\ub294 \ubc29\ubc95\uc744 \ucd94\uc0c1\ud654\ud560 \uc218 \uc788\ub294 \ud328\ud134\uc774\ub2e4. \uc608\uc81c \ucf54\ub4dc Factory\ub294 \uc5b4\ub5a4 \uae30\ub2a5\uc774\ub098 \ucd9c\ub825\uacb0\uacfc\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud574 \uad6c\uc131\ub418\ub294 \uac01\uac01\uc758 \uc694\uc18c\ub97c \uc0dd\uc131\ud558\ub294 \uad6c\uccb4\uc801\uc778 \ud074\ub798\uc2ac\ub974 \uc0dd\uc131\ud558\ub294 \ud074\ub798\uc2a4\uc774\ub2e4. Member\uc640 Club \uadf8\ub9ac\uace0 Page\uac00 \uac01\uac01\uc758 \uc694\uc18c\uc5d0 \ub300\ud55c \ucd94\uc0c1 \ud074\ub798\uc2a4\uc774\ub2e4. Item \ucd94\uc0c1 \ud074\ub798\uc2a4\ub294 Member\uc640 Club\uc744 \uac19\uc740 \uac1c\ub150\uc73c\ub85c &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=10516\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;[GoF] Abstract Factory \ud328\ud134&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-10516","post","type-post","status-publish","format-standard","hentry","category-design"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10516","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10516"}],"version-history":[{"count":4,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10516\/revisions"}],"predecessor-version":[{"id":10552,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10516\/revisions\/10552"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10516"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10516"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10516"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}