{"id":274,"date":"2020-04-19T21:09:48","date_gmt":"2020-04-19T12:09:48","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=274"},"modified":"2025-09-11T18:44:15","modified_gmt":"2025-09-11T09:44:15","slug":"design-pattern-factory-method","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2020\/04\/19\/274\/","title":{"rendered":"Design Pattern: Factory method"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Factory Method Pattern<\/h2>\n\n\n\n<p> \uac1d\uccb4 \uc0dd\uc131\uc744 \ub3d9\uc801\uc73c\ub85c \ud574\uc57c\ud574\uc11c \uc5b4\ub5a4 \uac1d\uccb4\ub97c \uc0dd\uc131\ud560\uc9c0 \uc54c \uc218 \uc5c6\uc744 \ub54c, \uac1d\uccb4 \uc0dd\uc131\ubc29\ubc95\uc744 \uc54c\uace0 \uc788\ub294 factory method\ub97c \ub530\ub85c \ub9cc\ub4e4\uace0 \uc0dd\uc131\uc744 \uc774 \uba54\uc18c\ub4dc\uc5d0 \uc704\uc784\ud574\uc11c \ub3d9\uc801\uc73c\ub85c \uc0dd\uc131\ud574 \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4. <br>\uc608\ub97c \ub4e4\uba74, \uc5ec\ub7ec \ud3ec\ub9f7\uc744 \uc9c0\uc6d0\ud558\ub294 \ubb38\uc11c \ud3b8\uc9d1\uae30\uc5d0\uc11c \uc0c8\ub85c\uc6b4 \ubb38\uc11c\ub97c \uc0dd\uc131\ud560 \ub54c \ubb38\uc11c \uc0dd\uc131\uc744 \ub2f4\ub2f9\ud558\ub294\uac8c factory method\uac00 \ub41c\ub2e4. \uadf8\ub9bc\ud310\uc5d0\uc11c \uc0bc\uac01\ud615, \uc0ac\uac01\ud615, \ub3d9\uadf8\ub77c\ubbf8\ub4f1\uc758 \ub3c4\ud615\uc744 \uc0dd\uc131\ud558\ub294 \uacbd\uc6b0, \uc5ed\uc2dc \uac1d\uccb4 \uc0dd\uc131\uc744 \ub2f4\ub2f9\ud558\ub294\uac8c factory method\uc774\ub2e4. \uc880 \ub354 \uac1c\uc778\uc801\uc73c\ub85c \uc640\ub2ff\ub294 \uc608\ub294 \uc2a4\ud0c0\ud06c\ub798\ud504\ud2b8\uc758 \uc9c4\uc9dc \ud329\ud1a0\ub9ac\ub97c \uc0dd\uac01\ud558\uba74 \ub41c\ub2e4. \ud329\ud1a0\ub9ac\ub294 \ud0f1\ud06c, \ubc8c\ucc98, \uace8\ub9ac\uc557\ub4f1\uc744 \uc0dd\uc0b0\ud560 \uc218 \uc788\uace0 \ud50c\ub808\uc774\uc5b4\uac00 \uc720\ub2db\uc744 \ucc0d\uc73c\uba74 \ud574\ub2f9 \uc720\ub2db\uc774 \ub098\uc628\ub2e4. \uc774 \uc9c4\uc9dc \ud329\ud1a0\ub9ac\uc758 \uad6c\ud604\uc740  factory method\ub97c \ub4e4\uace0 \uc788\ub294 Factory\uac1d\uccb4\ub97c \ub9cc\ub4e4\uc5b4\uc11c \uac00\ub2a5\ud558\ub2e4.<\/p>\n\n\n\n<p> \uae30\ubcf8 \ucee8\uc149\uc740 \uc55e\uc5d0\uc11c\ub4e0 \uc608\ub4e4\uacfc \uac19\uc740\ub370, \uc2e4\uc81c \uc124\uacc4\uc801 \uce21\uba74\uc5d0\uc11c \ubcc0\uacbd\uc0ac\ud56d\uc774 \ubc1c\uc0dd\ud560 \ub54c \uc720\uc5f0\ud558\uac8c \ub9cc\ub4e4\uae30 \uc704\ud574 \uc0c1\uc18d\uacfc \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc774\uc6a9\ud55c\ub2e4. \uc6b0\uc120, Creator\ub294 factory method\ub97c \uad6c\ud604\ud558\uc9c0 \uc54a\uace0, \uc11c\ube0c\ud074\ub798\uc2a4\uac00 \uc2e4\uc81c factory method\ub97c \uad6c\ud604\ud558\ub3c4\ub85d \uc704\uc784\ud55c\ub2e4. \ubcc0\uacbd\uc0ac\ud56d\uc774 \ubc1c\uc0dd\ud560 \uacbd\uc6b0, \ubcc0\uacbd\uc9c0\uc810\uc744 \ubd84\ub9ac\ud574\ub0b4\ub294 \uc791\uc5c5\uc774\ub2e4. \ubcc0\uacbd\uc0ac\ud56d\uc758 \uc608\ub77c\uace0 \ud55c\ub2e4\uba74 \uc0dd\uc131\ud560 product\uac00 \ucd94\uac00\ub418\uac70\ub098(\uc608 : \uadf8\ub9bc\ud310\uc5d0 \ubcc4\ubaa8\uc591\uc744 \ucd94\uac00), factory method\ub97c \uc5ec\ub7ec\uac1c(\uc608: \uc2a4\ud0c0\uc5d0\uc11c Barrack, Factory, Starport\ub4f1 \uc0dd\uc131\ud574\uc57c\ud558\ub294 \uc720\ub2db\ub4e4\uc774 \ub2e4\ub984) \ub9cc\ub4dc\ub294 \uacbd\uc6b0\ub4f1\uc744 \ub4e4 \uc218 \uc788\ub2e4.<br> factory method\uc5d0 \uc758\ud574 \uc0dd\uc131\ub418\ub294 \uac1d\uccb4\ub4e4\uc740 Product\ub77c\ub294 \ub3d9\uc77c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uac16\ub3c4\ub85d \ub9cc\ub4e0\ub2e4. \ub3c4\ud615\uc758 \uc608\ub77c\uba74, \uc704\uce58\uc774\ub3d9, \ud06c\uae30\ubcc0\uacbd\ub4f1 Shape\ub85c \uc774\ub984\uc9c0\uc744 \uc218 \uc788\ub294 \ucd94\uc0c1\ud074\ub798\uc2a4 \ub610\ub294 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uc874\uc7ac\ud558\uace0, \uc2a4\ud0c0\ud06c\ub798\ud504\ud2b8 \uc720\ub2db\uc774\ub77c\uba74, move, stop, attack\ub4f1 Unit\uc73c\ub85c \uc774\ub984\uc9c0\uc744\uc218 \uc788\ub294 \ucd94\uc0c1\ud074\ub798\uc2a4 \ub610\ub294 \uc778\ud130\ud398\uc774\uc2a4\uac00 \uac00\ub2a5\ud558\ub2e4. <\/p>\n\n\n\n<p>\ub9d0\ub85c \uc124\uba85\ud588\ub358 \ud074\ub798\uc2a4\ub4e4\uc744 UML\ub85c \uadf8\ub824\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4. \uc9c1\uc811 \uadf8\ub9ac\uc9c0 \uc54a\uace0 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Factory_method_pattern\">Wikipedia <\/a>\uc5d0\uc11c \uac00\uc838\uc654\ub294\ub370, \uc758\uc678\ub85c \uc0d8\ud50c\uc18c\uc2a4\uae4c\uc9c0 \uc124\uba85\uc774 \uc798 \ub418\uc5b4 \uc788\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"240\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/04\/W3sDesign_Factory_Method_Design_Pattern_UML.jpg\" alt=\"\" class=\"wp-image-417\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/W3sDesign_Factory_Method_Design_Pattern_UML.jpg 500w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/W3sDesign_Factory_Method_Design_Pattern_UML-300x144.jpg 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure>\n<\/div>\n\n\n<p>\uc2e4\uc81c\ub85c \uad6c\ud604\ud574\ubcf4\uc790.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Kotlin<\/h2>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package factorymethod\n\ndata class Position(var x: Int = 0, var y: Int = 0, var z: Int = 0)\ndata class Size(var x: Int = 0, var y: Int = 0)\nenum class FactoryUnit{VULTURE, TANK}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">package<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">factorymethod<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">data<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Position<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> x: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> y: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> z: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">data<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Size<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> x: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> y: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">enum<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">FactoryUnit<\/span><span style=\"color: #ADBAC7\">{VULTURE, TANK}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package factorymethod\n\nabstract class StarUnit {\n    var pos: Position = Position()\n    abstract var speed: Int\n    abstract val health: Int\n\n    abstract fun move(newPos: Position)\n    abstract  fun attack(attackPos: Position)\n}\n\nclass Vurture: StarUnit() {\n    override var speed: Int = 3\n    override val health: Int = 10\n\n    override fun move(newPos: Position) {\n        println(\"Vurture move\")\n    }\n\n    override fun attack(attackPos: Position) {\n        println(\"Vurture attack\")\n    }\n\n    fun mineInstall(){\n        println(\"mine install at $pos\")\n    }\n}\n\nclass Tank: StarUnit() {\n    override var speed: Int = 1\n    override val health: Int = 30\n    private var siegeMode: Boolean = false\n\n    override fun move(newPos: Position) {\n        if(siegeMode){\n            println(\"Siegemode. Can't move\")\n        }else{\n            println(\"Tank move\")\n        }\n    }\n\n    override fun attack(attackPos: Position) {\n        if(siegeMode){\n            println(\"Siegemode. Artillery fire.\")\n        }else{\n            println(\"Tank nomal fire.\")\n        }\n    }\n\n    fun modeChange(){\n        siegeMode = !siegeMode\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">package<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">factorymethod<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">StarUnit<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> pos: <\/span><span style=\"color: #F69D50\">Position<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Position<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> speed: <\/span><span style=\"color: #F69D50\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> health: <\/span><span style=\"color: #F69D50\">Int<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">move<\/span><span style=\"color: #ADBAC7\">(newPos: <\/span><span style=\"color: #F69D50\">Position<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\">  <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">attack<\/span><span style=\"color: #ADBAC7\">(attackPos: <\/span><span style=\"color: #F69D50\">Position<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Vurture<\/span><span style=\"color: #ADBAC7\">: <\/span><span style=\"color: #F69D50\">StarUnit<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> speed: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> health: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">10<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">move<\/span><span style=\"color: #ADBAC7\">(newPos: <\/span><span style=\"color: #F69D50\">Position<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Vurture move&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">attack<\/span><span style=\"color: #ADBAC7\">(attackPos: <\/span><span style=\"color: #F69D50\">Position<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Vurture attack&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">mineInstall<\/span><span style=\"color: #ADBAC7\">(){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;mine install at <\/span><span style=\"color: #6CB6FF\">$pos<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Tank<\/span><span style=\"color: #ADBAC7\">: <\/span><span style=\"color: #F69D50\">StarUnit<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> speed: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> health: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">30<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> siegeMode: <\/span><span style=\"color: #F69D50\">Boolean<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">false<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">move<\/span><span style=\"color: #ADBAC7\">(newPos: <\/span><span style=\"color: #F69D50\">Position<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\">(siegeMode){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Siegemode. Can&#39;t move&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Tank move&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">attack<\/span><span style=\"color: #ADBAC7\">(attackPos: <\/span><span style=\"color: #F69D50\">Position<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\">(siegeMode){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Siegemode. Artillery fire.&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Tank nomal fire.&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">modeChange<\/span><span style=\"color: #ADBAC7\">(){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        siegeMode <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">!<\/span><span style=\"color: #ADBAC7\">siegeMode<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Product\uc5d0 \ud574\ub2f9\ud558\ub294 StarUnit\uc744 \ub9cc\ub4e4\uace0 concrete class\ub85c Vurture, Tank\ub97c \ub9cc\ub4e4\uc5c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package factorymethod\n\nabstract  class Building{\n    abstract fun factoryMethod(type: FactoryUnit): StarUnit\n}\n\nclass Factory: Building() {\n    override fun factoryMethod(type: FactoryUnit): StarUnit {\n        when(type){\n            FactoryUnit.TANK    ->  return Tank()\n            FactoryUnit.VULTURE ->  return Vurture()\n            else -> throw Exception(\"Can't produce $type unit.\")\n        }\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">package<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">factorymethod<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\">  <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Building<\/span><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">factoryMethod<\/span><span style=\"color: #ADBAC7\">(type: <\/span><span style=\"color: #F69D50\">FactoryUnit<\/span><span style=\"color: #ADBAC7\">): <\/span><span style=\"color: #F69D50\">StarUnit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Factory<\/span><span style=\"color: #ADBAC7\">: <\/span><span style=\"color: #F69D50\">Building<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">factoryMethod<\/span><span style=\"color: #ADBAC7\">(type: <\/span><span style=\"color: #F69D50\">FactoryUnit<\/span><span style=\"color: #ADBAC7\">): <\/span><span style=\"color: #F69D50\">StarUnit<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">when<\/span><span style=\"color: #ADBAC7\">(type){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            FactoryUnit.TANK    <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\">  <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Tank<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            FactoryUnit.VULTURE <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\">  <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Vurture<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">-&gt;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">throw<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Exception<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Can&#39;t produce <\/span><span style=\"color: #6CB6FF\">$type<\/span><span style=\"color: #96D0FF\"> unit.&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>factory method\ub97c \uc11c\ube0c\ud074\ub798\uc2a4\uc5d0\uc11c \uad6c\ud604\ud588\ub2e4. \ucc3e\uc544\ubcf4\ub2c8, \uc774 \ubd80\ubd84\uc744 companion object\ub85c \uad6c\ud604\ud558\uae30\ub3c4 \ud558\ub294\uac70 \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package factorymethod\n\nfun main(args: Array&lt;String>){\n    val factory:Building = Factory()\n\n    val unit1: StarUnit = factory.factoryMethod(FactoryUnit.VULTURE)\n    val unit2: StarUnit =  factory.factoryMethod(FactoryUnit.VULTURE)\n    val unit3: StarUnit = factory.factoryMethod(FactoryUnit.TANK)\n\n    unit1.move(Position(10, 5, 15))\n    unit2.attack(Position(3, 20, 4))\n    unit3.move(Position(7, 7, 4))\n    unit3.attack(Position(10, 20, 30))\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">package<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">factorymethod<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">(args: <\/span><span style=\"color: #F69D50\">Array<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">&gt;){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> factory:<\/span><span style=\"color: #F69D50\">Building<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Factory<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> unit1: <\/span><span style=\"color: #F69D50\">StarUnit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> factory.<\/span><span style=\"color: #DCBDFB\">factoryMethod<\/span><span style=\"color: #ADBAC7\">(FactoryUnit.VULTURE)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> unit2: <\/span><span style=\"color: #F69D50\">StarUnit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\">  factory.<\/span><span style=\"color: #DCBDFB\">factoryMethod<\/span><span style=\"color: #ADBAC7\">(FactoryUnit.VULTURE)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> unit3: <\/span><span style=\"color: #F69D50\">StarUnit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> factory.<\/span><span style=\"color: #DCBDFB\">factoryMethod<\/span><span style=\"color: #ADBAC7\">(FactoryUnit.TANK)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    unit1.<\/span><span style=\"color: #DCBDFB\">move<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #DCBDFB\">Position<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">10<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">5<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">15<\/span><span style=\"color: #ADBAC7\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    unit2.<\/span><span style=\"color: #DCBDFB\">attack<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #DCBDFB\">Position<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">20<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #ADBAC7\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    unit3.<\/span><span style=\"color: #DCBDFB\">move<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #DCBDFB\">Position<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">7<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">7<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #ADBAC7\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    unit3.<\/span><span style=\"color: #DCBDFB\">attack<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #DCBDFB\">Position<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">10<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">20<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">30<\/span><span style=\"color: #ADBAC7\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Vurture move\nVurture attack\nTank move\nTank nomal fire.<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">Vurture move<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Vurture attack<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Tank move<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Tank nomal fire.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ud074\ub77c\uc774\uc5b8\ud2b8 \ucf54\ub4dc\uc5d0\uc11c \ud544\uc694\ud560 \ub54c\ub9c8\ub2e4 \ub3d9\uc801\uc73c\ub85c \uc720\ub2db\uc744 \uc0dd\uc0b0\ud558\uace0 \uc870\uc791\ud560 \uc218 \uc788\ub2e4. \ud55c\uac00\uc9c0 \uc758\ubb38\uc810\uc740 \uac01 \uc720\ub2db\ub9c8\ub2e4 \ud2b9\ud654\ub41c \ucee4\ub9e8\ub4dc\ub294 \uc5b4\ub5bb\uac8c \ucc98\ub9ac\ud574\uc57c \ud558\ub294\uac00\uc778\ub370, \ub2e4\ub978 \ub514\uc790\uc778\ud328\ud134\uc744 \uc774\uc6a9\ud558\uac70\ub098 \uad6c\uc870\uac00 \ubcf5\uc7a1\ud574\uc9c8\uac70 \uac19\uc544 \uc5ec\uae30\uc11c\ub294 \uad6c\ud604\ud558\uc9c0 \uc54a\uc558\ub2e4. \ub514\uc790\uc778 \ud328\ud134\uc744 \uc0b4\ud3b4\ubcf4\ub2e4\uac00 \ub2e4\uc2dc \ub098\uc62c \uc218\ub3c4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">C#<\/h2>\n\n\n\n<p>C#\uc774\uae34\ud55c\ub370, Unity\uc5d0\uc11c \uad6c\ud604\ud588\ub2e4. \ud2b9\ubcc4\ud55c \uc758\uc874\uc131\uc740 Vector3\uc640 main\ud568\uc218 \ub300\uc2e0 client \uc758 start()\ub97c \uc0ac\uc6a9\ud55c \uac83\uc678\uc5d0 \uc5c6\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>using UnityEngine;\n\nnamespace FactoryMethod\n{\n    public abstract class StarUnit\n    {\n        protected Vector3 pos = new Vector3();\n        public abstract int Speed { get; }\n        public abstract int Health { get; set; }\n\n        public abstract void Move(Vector3 newPos);\n        public abstract void Attack(Vector3 attackPos);\n    }\n\n    public class Vurture : StarUnit\n    {\n        private int _health = 10;\n        private int _speed = 3;\n        public override int Speed { get{ return _speed; } }\n        public override int Health { get { return _health; } set { _health = value; } }\n\n        public override void Attack(Vector3 attackPos)\n        {\n            Debug.Log(\"Vurture attack\");\n        }\n\n        public override void Move(Vector3 newPos)\n        {\n            Debug.Log(\"Vurture move\");\n        }\n\n        public void mineInstall()\n        {\n            Debug.Log(\"mine install at \" + pos);\n        }\n    }\n\n    public class Tank : StarUnit\n    {\n        private int _health = 30;\n        private int _speed = 1;\n        private bool _siege = false;\n\n        public override int Speed { get { return _speed; } }\n        public override int Health { get { return _health; } set { _speed = value; } }\n\n        public override void Attack(Vector3 attackPos)\n        {\n            if (_siege)\n            {\n                Debug.Log(\"Siegemode. Artillery fire.\");\n            }\n            else\n            {\n                Debug.Log(\"Tank normal fire.\");\n            }\n        }\n\n        public override void Move(Vector3 newPos)\n        {\n            if (_siege)\n            {\n                Debug.Log(\"Siegemode. Can't move.\");\n            }\n            else\n            {\n                Debug.Log(\"Tank move.\");\n            }\n        }\n\n        public void modeChange()\n        {\n            _siege = !_siege;\n        }\n    }\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">using<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">UnityEngine<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">namespace<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">FactoryMethod<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">StarUnit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">protected<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Vector3<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">pos<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Vector3<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Speed<\/span><span style=\"color: #ADBAC7\"> { <\/span><span style=\"color: #F47067\">get<\/span><span style=\"color: #ADBAC7\">; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Health<\/span><span style=\"color: #ADBAC7\"> { <\/span><span style=\"color: #F47067\">get<\/span><span style=\"color: #ADBAC7\">; <\/span><span style=\"color: #F47067\">set<\/span><span style=\"color: #ADBAC7\">; }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Move<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">Vector3<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">newPos<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Attack<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">Vector3<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">attackPos<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Vurture<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">StarUnit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">_health<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">10<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">_speed<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Speed<\/span><span style=\"color: #ADBAC7\"> { <\/span><span style=\"color: #F47067\">get<\/span><span style=\"color: #ADBAC7\">{ <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> _speed; } }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Health<\/span><span style=\"color: #ADBAC7\"> { <\/span><span style=\"color: #F47067\">get<\/span><span style=\"color: #ADBAC7\"> { <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> _health; } <\/span><span style=\"color: #F47067\">set<\/span><span style=\"color: #ADBAC7\"> { _health <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> value; } }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Attack<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">Vector3<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">attackPos<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            Debug.<\/span><span style=\"color: #DCBDFB\">Log<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Vurture attack&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Move<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">Vector3<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">newPos<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            Debug.<\/span><span style=\"color: #DCBDFB\">Log<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Vurture move&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">mineInstall<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            Debug.<\/span><span style=\"color: #DCBDFB\">Log<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;mine install at &quot;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> pos);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Tank<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">StarUnit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">_health<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">30<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">_speed<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">bool<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">_siege<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">false<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Speed<\/span><span style=\"color: #ADBAC7\"> { <\/span><span style=\"color: #F47067\">get<\/span><span style=\"color: #ADBAC7\"> { <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> _speed; } }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Health<\/span><span style=\"color: #ADBAC7\"> { <\/span><span style=\"color: #F47067\">get<\/span><span style=\"color: #ADBAC7\"> { <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> _health; } <\/span><span style=\"color: #F47067\">set<\/span><span style=\"color: #ADBAC7\"> { _speed <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> value; } }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Attack<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">Vector3<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">attackPos<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> (_siege)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                Debug.<\/span><span style=\"color: #DCBDFB\">Log<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Siegemode. Artillery fire.&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                Debug.<\/span><span style=\"color: #DCBDFB\">Log<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Tank normal fire.&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Move<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">Vector3<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">newPos<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> (_siege)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                Debug.<\/span><span style=\"color: #DCBDFB\">Log<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Siegemode. Can&#39;t move.&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                Debug.<\/span><span style=\"color: #DCBDFB\">Log<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Tank move.&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">modeChange<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            _siege <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">!<\/span><span style=\"color: #ADBAC7\">_siege;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>C# \uad6c\ud604\uc5d0\uc11c \ub208\uc5ec\uaca8 \ubcfc \ubd80\ubd84\uc740 variable\uc744 \ub2e4\ub8e8\ub294 \ubd80\ubd84\uc774\ub2e4. \uc9c1\uc811\uc801\uc73c\ub85c abstract\ub85c \uc124\uc815\uc774 \uc548\ub418\ubbc0\ub85c property\uc758 get()\/set()\uc744 abstract method\ub85c \ub2e4\ub8e8\uace0 \uc788\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\nnamespace FactoryMethod\n{\n    public enum FactoryUnit { VURTURE, TANK }\n\n    public abstract class Building\n    {\n        public abstract StarUnit FactoryMethod(FactoryUnit type);\n    }\n\n    public class Factory : Building\n    {\n        public override StarUnit FactoryMethod(FactoryUnit type)\n        {\n            switch (type)\n            {\n                case FactoryUnit.TANK:\n                    return new Tank();\n                case FactoryUnit.VURTURE:\n                    return new Vurture();\n                default:\n                    throw new System.Exception();\n            }\n        }\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">namespace<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">FactoryMethod<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">enum<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">FactoryUnit<\/span><span style=\"color: #ADBAC7\"> { <\/span><span style=\"color: #F69D50\">VURTURE<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F69D50\">TANK<\/span><span style=\"color: #ADBAC7\"> }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Building<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">StarUnit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">FactoryMethod<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">FactoryUnit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">type<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Factory<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">Building<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">StarUnit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">FactoryMethod<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">FactoryUnit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">type<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">switch<\/span><span style=\"color: #ADBAC7\"> (type)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                <\/span><span style=\"color: #F47067\">case<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">FactoryUnit<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #F69D50\">TANK<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                    <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Tank<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                <\/span><span style=\"color: #F47067\">case<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">FactoryUnit<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #F69D50\">VURTURE<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                    <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Vurture<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                <\/span><span style=\"color: #F47067\">default<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                    <\/span><span style=\"color: #F47067\">throw<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">System<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #F69D50\">Exception<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>enum\uc5d0\ub3c4 public\uc744 \ubd99\uc5ec\uc918\uc57c \ub2e4\ub978 \uacf3\uc5d0\uc11c \uc0ac\uc6a9\uac00\ub2a5\ud558\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>using UnityEngine;\nusing FactoryMethod;\n\npublic class Client : MonoBehaviour\n{\n    \/\/ Start is called before the first frame update\n    void Start()\n    {\n        Building factory = new Factory();\n\n        StarUnit unit1 = factory.FactoryMethod(FactoryUnit.VURTURE);\n        StarUnit unit2 = factory.FactoryMethod(FactoryUnit.VURTURE);\n        StarUnit unit3 = factory.FactoryMethod(FactoryUnit.TANK);\n\n        unit1.Move(new Vector3(10, 5, 15));\n        unit2.Attack(new Vector3(3, 20, 4));\n        unit3.Move(new Vector3(7, 7, 4));\n        unit3.Attack(new Vector3(10, 20, 30));\n    }\n\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">using<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">UnityEngine<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">using<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">FactoryMethod<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Client<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">MonoBehaviour<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #768390\">    \/\/ Start is called before the first frame update<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Start<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F69D50\">Building<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">factory<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Factory<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F69D50\">StarUnit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">unit1<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> factory.<\/span><span style=\"color: #DCBDFB\">FactoryMethod<\/span><span style=\"color: #ADBAC7\">(FactoryUnit.VURTURE);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F69D50\">StarUnit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">unit2<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> factory.<\/span><span style=\"color: #DCBDFB\">FactoryMethod<\/span><span style=\"color: #ADBAC7\">(FactoryUnit.VURTURE);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F69D50\">StarUnit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">unit3<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> factory.<\/span><span style=\"color: #DCBDFB\">FactoryMethod<\/span><span style=\"color: #ADBAC7\">(FactoryUnit.TANK);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        unit1.<\/span><span style=\"color: #DCBDFB\">Move<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Vector3<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">10<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">5<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">15<\/span><span style=\"color: #ADBAC7\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        unit2.<\/span><span style=\"color: #DCBDFB\">Attack<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Vector3<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">20<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #ADBAC7\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        unit3.<\/span><span style=\"color: #DCBDFB\">Move<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Vector3<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">7<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">7<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #ADBAC7\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        unit3.<\/span><span style=\"color: #DCBDFB\">Attack<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Vector3<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">10<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">20<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">30<\/span><span style=\"color: #ADBAC7\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>main\ud568\uc218\ub300\uc2e0 empty game object\ub97c \ud558\ub098 \uc0dd\uc131\ud558\uace0 Client.cs \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ubd99\uc5ec\uc918\uc11c \ud14c\uc2a4\ud2b8 \ud588\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"771\" height=\"172\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/04\/factorymethod.png\" alt=\"\" class=\"wp-image-426\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/factorymethod.png 771w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/factorymethod-300x67.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/factorymethod-768x171.png 768w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Python<\/h2>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>from dataclasses import dataclass\nfrom enum import Enum\n\n\n@dataclass\nclass Position:\n    x: int = 0\n    y: int = 0\n    z: int = 0\n\n\nclass FactoryUnit(Enum):\n    VURTURE = 1\n    TANK = 2\n\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">from<\/span><span style=\"color: #ADBAC7\"> dataclasses <\/span><span style=\"color: #F47067\">import<\/span><span style=\"color: #ADBAC7\"> dataclass<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">from<\/span><span style=\"color: #ADBAC7\"> enum <\/span><span style=\"color: #F47067\">import<\/span><span style=\"color: #ADBAC7\"> Enum<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCBDFB\">@dataclass<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Position<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    x: <\/span><span style=\"color: #6CB6FF\">int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    y: <\/span><span style=\"color: #6CB6FF\">int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    z: <\/span><span style=\"color: #6CB6FF\">int<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">FactoryUnit<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">Enum<\/span><span style=\"color: #ADBAC7\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #6CB6FF\">VURTURE<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #6CB6FF\">TANK<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">2<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Kotlin\uc5d0\uc11c\uc640 \ub3d9\uc77c\ud558\uac8c data class\uc640 enum class\ub97c python \ubb38\ubc95\uc73c\ub85c \uc815\uc758\ud588\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>from factory_method.data import *\n\nclass StarUnit:\n    def __init__(self):\n        self.pos: Position = Position()\n\n    @property\n    def health(self):\n        raise NotImplementedError\n\n    @health.setter\n    def health(self, value):\n        raise NotImplementedError\n\n    @property\n    def speed(self):\n        raise NotImplementedError\n\n    def move(self, new_pos: Position):\n        raise NotImplementedError\n\n    def attack(self, attack_pos: Position):\n        raise NotImplementedError\n\nclass Vulture(StarUnit):\n    def __init__(self):\n        super().__init__()\n        self._speed = 3\n        self._health = 10\n\n    @property\n    def health(self):\n        return self._health\n\n    @health.setter\n    def health(self, value):\n        self._health = value\n\n    @property\n    def speed(self):\n        return self._speed\n\n    def move(self, new_pos: Position):\n        print(f\"Vurture move to {new_pos}\")\n\n    def attack(self, attack_pos: Position):\n        print(f\"Vurture attack to {attack_pos}\")\n\n    def mine_install(self):\n        print(f\"mine install at {self.pos}\")\n\nclass Tank(StarUnit):\n    def __init__(self):\n        super().__init__()\n        self._speed = 1\n        self._health = 30\n        self._siege_mode = False\n\n    @property\n    def health(self):\n        return self._health\n\n    @health.setter\n    def health(self, value):\n        self._health = value\n\n    @property\n    def speed(self):\n        return self._speed\n\n    def move(self, new_pos: Position):\n        if self._siege_mode:\n            print(\"Siegemode. Can't move.\")\n        else:\n            print(f\"Tank move to {new_pos}\")\n\n    def attack(self, attack_pos: Position):\n        if self._siege_mode:\n            print(f\"Siegemede. artillery fire! To {attack_pos}\")\n        else:\n            print(f\"Tank nomal attack to {attack_pos}\")\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">from<\/span><span style=\"color: #ADBAC7\"> factory_method.data <\/span><span style=\"color: #F47067\">import<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">*<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">StarUnit<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">__init__<\/span><span style=\"color: #ADBAC7\">(self):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">.pos: Position <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> Position()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">@<\/span><span style=\"color: #6CB6FF\">property<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">health<\/span><span style=\"color: #ADBAC7\">(self):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">raise<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">NotImplementedError<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">@health.setter<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">health<\/span><span style=\"color: #ADBAC7\">(self, value):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">raise<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">NotImplementedError<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">@<\/span><span style=\"color: #6CB6FF\">property<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">speed<\/span><span style=\"color: #ADBAC7\">(self):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">raise<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">NotImplementedError<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">move<\/span><span style=\"color: #ADBAC7\">(self, new_pos: Position):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">raise<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">NotImplementedError<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">attack<\/span><span style=\"color: #ADBAC7\">(self, attack_pos: Position):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">raise<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">NotImplementedError<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Vulture<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">StarUnit<\/span><span style=\"color: #ADBAC7\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">__init__<\/span><span style=\"color: #ADBAC7\">(self):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">super<\/span><span style=\"color: #ADBAC7\">().<\/span><span style=\"color: #6CB6FF\">__init__<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">._speed <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">._health <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">10<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">@<\/span><span style=\"color: #6CB6FF\">property<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">health<\/span><span style=\"color: #ADBAC7\">(self):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">._health<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">@health.setter<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">health<\/span><span style=\"color: #ADBAC7\">(self, value):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">._health <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> value<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">@<\/span><span style=\"color: #6CB6FF\">property<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">speed<\/span><span style=\"color: #ADBAC7\">(self):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">._speed<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">move<\/span><span style=\"color: #ADBAC7\">(self, new_pos: Position):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">f<\/span><span style=\"color: #96D0FF\">&quot;Vurture move to <\/span><span style=\"color: #F47067\">{<\/span><span style=\"color: #ADBAC7\">new_pos<\/span><span style=\"color: #F47067\">}<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">attack<\/span><span style=\"color: #ADBAC7\">(self, attack_pos: Position):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">f<\/span><span style=\"color: #96D0FF\">&quot;Vurture attack to <\/span><span style=\"color: #F47067\">{<\/span><span style=\"color: #ADBAC7\">attack_pos<\/span><span style=\"color: #F47067\">}<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">mine_install<\/span><span style=\"color: #ADBAC7\">(self):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">f<\/span><span style=\"color: #96D0FF\">&quot;mine install at <\/span><span style=\"color: #F47067\">{<\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">.pos<\/span><span style=\"color: #F47067\">}<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Tank<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">StarUnit<\/span><span style=\"color: #ADBAC7\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">__init__<\/span><span style=\"color: #ADBAC7\">(self):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">super<\/span><span style=\"color: #ADBAC7\">().<\/span><span style=\"color: #6CB6FF\">__init__<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">._speed <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">._health <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">30<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">._siege_mode <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">False<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">@<\/span><span style=\"color: #6CB6FF\">property<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">health<\/span><span style=\"color: #ADBAC7\">(self):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">._health<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">@health.setter<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">health<\/span><span style=\"color: #ADBAC7\">(self, value):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">._health <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> value<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">@<\/span><span style=\"color: #6CB6FF\">property<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">speed<\/span><span style=\"color: #ADBAC7\">(self):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">._speed<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">move<\/span><span style=\"color: #ADBAC7\">(self, new_pos: Position):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">._siege_mode:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #6CB6FF\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Siegemode. Can&#39;t move.&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #6CB6FF\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">f<\/span><span style=\"color: #96D0FF\">&quot;Tank move to <\/span><span style=\"color: #F47067\">{<\/span><span style=\"color: #ADBAC7\">new_pos<\/span><span style=\"color: #F47067\">}<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">attack<\/span><span style=\"color: #ADBAC7\">(self, attack_pos: Position):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">self<\/span><span style=\"color: #ADBAC7\">._siege_mode:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #6CB6FF\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">f<\/span><span style=\"color: #96D0FF\">&quot;Siegemede. artillery fire! To <\/span><span style=\"color: #F47067\">{<\/span><span style=\"color: #ADBAC7\">attack_pos<\/span><span style=\"color: #F47067\">}<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #6CB6FF\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">f<\/span><span style=\"color: #96D0FF\">&quot;Tank nomal attack to <\/span><span style=\"color: #F47067\">{<\/span><span style=\"color: #ADBAC7\">attack_pos<\/span><span style=\"color: #F47067\">}<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Python\uc5d0\uc11c abstract class\ub97c \ub9cc\ub4dc\ub294 \ubc29\ubc95\uc740 abs \ubaa8\ub4c8\uc744 \uc784\ud3ec\ud2b8\ud574\uc11c ABC\ub97c \uc0c1\uc18d\ubc1b\uc544 \uc4f0\ub294 \ubc29\ubc95\uc774 \uc788\ub2e4. \uc5ec\uae30\uc11c\ub294 \ub2e8\uc21c\ud558\uac8c, raise exception\uc744 \uc774\uc6a9\ud574 \uad6c\ud604\ud588\ub2e4. C#\uc5d0\uc11c\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c member variable\uc744 abstract\ub85c \ub9cc\ub4dc\ub294 \ubc29\ubc95\uc774 \uc5c6\uc73c\ubbc0\ub85c, property\ub97c \uc774\uc6a9\ud574 getter\/setter\ub97c \uc0c1\uc18d\ubc1b\ub3c4\ub85d \ub9cc\ub4e4\uc5c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>from factory_method.StarUnit import *\n\nclass Building:\n\n    def factory_method(self, unit_type: FactoryUnit) -> StarUnit:\n        raise NotImplementedError\n\nclass Factory(Building):\n    def factory_method(self, unit_type: FactoryUnit) -> StarUnit:\n        if unit_type == FactoryUnit.VURTURE:\n            return Vulture()\n        elif unit_type == FactoryUnit.TANK:\n            return Tank()\n        else:\n            raise ValueError<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">from<\/span><span style=\"color: #ADBAC7\"> factory_method.StarUnit <\/span><span style=\"color: #F47067\">import<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">*<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Building<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">factory_method<\/span><span style=\"color: #ADBAC7\">(self, unit_type: FactoryUnit) -&gt; StarUnit:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">raise<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">NotImplementedError<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Factory<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">Building<\/span><span style=\"color: #ADBAC7\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">factory_method<\/span><span style=\"color: #ADBAC7\">(self, unit_type: FactoryUnit) -&gt; StarUnit:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> unit_type <\/span><span style=\"color: #F47067\">==<\/span><span style=\"color: #ADBAC7\"> FactoryUnit.<\/span><span style=\"color: #6CB6FF\">VURTURE<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> Vulture()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">elif<\/span><span style=\"color: #ADBAC7\"> unit_type <\/span><span style=\"color: #F47067\">==<\/span><span style=\"color: #ADBAC7\"> FactoryUnit.<\/span><span style=\"color: #6CB6FF\">TANK<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> Tank()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">raise<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">ValueError<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>factory_method\ub9cc \uc11c\ube0c\ud074\ub798\uc2a4\uc5d0\uc11c \uad6c\ud604\ud558\ub3c4\ub85d \ub9cc\ub4e4\uc5c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>from factory_method.Building import *\nfrom factory_method.StarUnit import *\n\ndef main():\n    myFactory: Building = Factory()\n    unit1: StarUnit = myFactory.factory_method(FactoryUnit.VURTURE)\n    unit2: StarUnit = myFactory.factory_method(FactoryUnit.VURTURE)\n    unit3: StarUnit = myFactory.factory_method(FactoryUnit.TANK)\n\n    unit1.move(Position(10, 5, 15))\n    unit2.attack(Position(3, 20, 4))\n    unit3.move(Position(7, 7, 4))\n    unit3.attack(Position(10, 20, 30))\n\n\nif __name__ == \"__main__\":\n    main()\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">from<\/span><span style=\"color: #ADBAC7\"> factory_method.Building <\/span><span style=\"color: #F47067\">import<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">*<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">from<\/span><span style=\"color: #ADBAC7\"> factory_method.StarUnit <\/span><span style=\"color: #F47067\">import<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">*<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    myFactory: Building <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> Factory()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    unit1: StarUnit <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> myFactory.factory_method(FactoryUnit.<\/span><span style=\"color: #6CB6FF\">VURTURE<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    unit2: StarUnit <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> myFactory.factory_method(FactoryUnit.<\/span><span style=\"color: #6CB6FF\">VURTURE<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    unit3: StarUnit <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> myFactory.factory_method(FactoryUnit.<\/span><span style=\"color: #6CB6FF\">TANK<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    unit1.move(Position(<\/span><span style=\"color: #6CB6FF\">10<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">5<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">15<\/span><span style=\"color: #ADBAC7\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    unit2.attack(Position(<\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">20<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #ADBAC7\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    unit3.move(Position(<\/span><span style=\"color: #6CB6FF\">7<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">7<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #ADBAC7\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    unit3.attack(Position(<\/span><span style=\"color: #6CB6FF\">10<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">20<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">30<\/span><span style=\"color: #ADBAC7\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">__name__<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">==<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;__main__&quot;<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    main()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Client\uc5d0\uc11c \uc0ac\uc6a9\uc740 \ub2e4\ub978\uc5b8\uc5b4\uc640 \ub3d9\uc77c\ud558\ub2e4. \ub3d9\uc801\uc73c\ub85c \uc0dd\uc131\ud558\uace0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Vurture move to Position(x=10, y=5, z=15)\nVurture attack to Position(x=3, y=20, z=4)\nTank move to Position(x=7, y=7, z=4)\nTank nomal attack to Position(x=10, y=20, z=30)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">Vurture move to Position(<\/span><span style=\"color: #F69D50\">x<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #6CB6FF\">10<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F69D50\">y<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #6CB6FF\">5<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F69D50\">z<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #6CB6FF\">15<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Vurture attack to Position(<\/span><span style=\"color: #F69D50\">x<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #6CB6FF\">3<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F69D50\">y<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #6CB6FF\">20<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F69D50\">z<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Tank move to Position(<\/span><span style=\"color: #F69D50\">x<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #6CB6FF\">7<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F69D50\">y<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #6CB6FF\">7<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F69D50\">z<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #6CB6FF\">4<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Tank nomal attack to Position(<\/span><span style=\"color: #F69D50\">x<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #6CB6FF\">10<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F69D50\">y<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #6CB6FF\">20<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F69D50\">z<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #6CB6FF\">30<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<p>\uc774\uac78 \ubcf4\uba74\uc11c \ub290\ub080\uc810\uc740 \ub514\uc790\uc778 \ud328\ud134\uc744 \uc774\ud574\ud558\uae30 \uc704\ud574 \ub450\uac00\uc9c0\ub97c \uc774\ud574\ud574\uc57c \ud55c\ub2e4\ub294 \uc0ac\uc2e4\uc774\ub2e4. <\/p>\n\n\n\n<ul class=\"wp-block-list is-style-default\">\n<li> <strong>\ud574\uacb0\ud558\ub824\ub294 \ubb38\uc81c\uac00 \ubb34\uc5c7\uc778\uac00?<\/strong><\/li>\n\n\n\n<li><strong> \uc218\uc815\uc774\ub098 \ubcc0\uacbd\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \uc720\uc5f0\ud558\uac8c \ub9cc\ub4e4\uac83\uc778\uac00?<\/strong><\/li>\n<\/ul>\n\n\n\n<p><br>Factory method\uc5d0\uc11c 1\ubc88 \ubb38\uc81c\ub294 \uac1d\uccb4\ub4e4\uc744 \ub3d9\uc801\uc73c\ub85c \uc0dd\uc131\ud558\ub294\ub370 \uc5b4\ub5a4 \uac1d\uccb4\ub97c \uc0dd\uc131\ud560\uc9c0 \uc54c \uc218 \uc5c6\ub2e4\ub294 \uc810\uc774\ub2e4. \uc774\ub97c \uc704\ud574 \uac1d\uccb4 \uc0dd\uc131\ubc29\ubc95\uc744 \uc54c\uace0 \uc788\ub294 factory method\ub97c \ub3c4\uc785\ud588\ub2e4.<br> 2\ubc88\ubb38\uc81c\uc758 \ub2f5\uc740 \ub300\ubd80\ubd84 \uc720\uc0ac\ud55c\ub370, interface, virtual class\ub97c \uc774\uc6a9\ud574 \uad00\uacc4\ub97c \ub9fa\ub3c4\ub85d \ud558\ub294 \uac83\uc774\ub2e4. \uc5ec\uae30\uc5d0\uc120 Factory method\ub97c \uc11c\ube0c\ud074\ub798\uc2a4\uc5d0 \uad6c\ud604\uc744 \ud558\ub3c4\ub85d \uc704\uc784\ud574\uc11c factory method\uc758 \ubcc0\uacbd\uc774 \uac04\ud3b8\ud558\ub3c4\ub85d \ud588\uace0, Product\ub4e4\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud1b5\uc77c \uc2dc\ucf1c Creator\uc640\uc758 \ucee4\ud50c\ub9c1\uc744 \ub290\uc2a8\ud558\uac8c \ub9cc\ub4e4\uc5c8\ub2e4. <\/p>\n\n\n\n<p>\uc55e\uc73c\ub85c \uc62c\ub9b4 Design Pattern\ub4e4\ub3c4 \uc5ec\uae30\uc5d0 \ud3ec\ucee4\uc2f1\uc744 \ud574\uc11c \uc815\ub9ac\ud574\ubcf4\ub3c4\ub85d \ub178\ub825\ud558\uaca0\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Factory Method Pattern \uac1d\uccb4 \uc0dd\uc131\uc744 \ub3d9\uc801\uc73c\ub85c \ud574\uc57c\ud574\uc11c \uc5b4\ub5a4 \uac1d\uccb4\ub97c \uc0dd\uc131\ud560\uc9c0 \uc54c \uc218 \uc5c6\uc744 \ub54c, \uac1d\uccb4 \uc0dd\uc131\ubc29\ubc95\uc744 \uc54c\uace0 \uc788\ub294 factory method\ub97c \ub530\ub85c \ub9cc\ub4e4\uace0 \uc0dd\uc131\uc744 \uc774 \uba54\uc18c\ub4dc\uc5d0 \uc704\uc784\ud574\uc11c \ub3d9\uc801\uc73c\ub85c \uc0dd\uc131\ud574 \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4. \uc608\ub97c \ub4e4\uba74, \uc5ec\ub7ec \ud3ec\ub9f7\uc744 \uc9c0\uc6d0\ud558\ub294 \ubb38\uc11c \ud3b8\uc9d1\uae30\uc5d0\uc11c \uc0c8\ub85c\uc6b4 \ubb38\uc11c\ub97c \uc0dd\uc131\ud560 \ub54c \ubb38\uc11c \uc0dd\uc131\uc744 \ub2f4\ub2f9\ud558\ub294\uac8c factory method\uac00 \ub41c\ub2e4. \uadf8\ub9bc\ud310\uc5d0\uc11c \uc0bc\uac01\ud615, \uc0ac\uac01\ud615, \ub3d9\uadf8\ub77c\ubbf8\ub4f1\uc758 \ub3c4\ud615\uc744 \uc0dd\uc131\ud558\ub294 \uacbd\uc6b0, \uc5ed\uc2dc [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,34,33],"tags":[104,157,38,35,118,128,21,41,55],"class_list":["post-274","post","type-post","status-publish","format-standard","hentry","category-unity","category-kotlin","category-python","tag-design-pattern","tag-factory-method","tag-kotlin","tag-python","tag-unity-2","tag-design-pattern-kr","tag-unity","tag-kotlin-kr","tag-python-kr"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/comments?post=274"}],"version-history":[{"count":19,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/274\/revisions"}],"predecessor-version":[{"id":3456,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/274\/revisions\/3456"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=274"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}