Skip to content

Latest commit

ย 

History

History
158 lines (109 loc) ยท 6.58 KB

File metadata and controls

158 lines (109 loc) ยท 6.58 KB

FactoryMethod ํŒจํ„ด

Template Method ํŒจํ„ด์€ ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ์ฒ˜๋ฆฌ์˜ ๋ผˆ๋Œ€๋ฅผ ๋งŒ๋“ค๊ณ , ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๊ตฌ์ฒด์ ์ธ ์ฒ˜๋ฆฌ์˜ ์‚ด์„ ๋ถ™์˜€๋‹ค๋ฉด, FactoryMethod ํŒจํ„ด์€ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์žฅ๋ฉด์— ์ ์šฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. FactoryMethod ํŒจํ„ด์—์„œ๋Š” ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ๊ฒฐ์ •ํ•˜๋˜, ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค ์ด๋ฆ„๊นŒ์ง€๋Š” ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์‚ด์€ ๋ชจ๋‘ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๋ถ™์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์ถ”์ƒํ™”๋œ ์ƒ์œ„ ํด๋ž˜์Šค Create์™€ Product

์•„๋ž˜์˜ ๋‘ ํด๋ž˜์Šค๋Š” ๊ฐ๊ฐ Creator์™€ Product๋ผ๋Š” ๋‘ ๊ฐ€์ง€๋ฅผ ์ถ”์ƒํ™”ํ•œ ํด๋ž˜์Šค ์ž…๋‹ˆ๋‹ค. ์„ธ๋ถ€ ๋‚ด์šฉ์„ ๋ณด๋ฉด Factory ํด๋ž˜์Šค์—์„œ๋Š” Producr๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ผ๋ฟ ์ •ํ™•ํžˆ Product๊ฐ€ ์–ด๋–ค๊ฑด์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด์™ธ์˜ ๋“ฑ๋กํ•˜๊ณ , ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ • ์กฐ์ฐจ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

package part4_factory_method_pattern.framework;

public abstract class Factory {
    public final Product create(String owner) {
        Product p = createProduct(owner);
        registerProduct(p);
        return p;
    }
    protected abstract Product createProduct(String owner);

    protected abstract void registerProduct(Product product);

}


/***************************************************/


package part4_factory_method_pattern.framework;

public abstract class Product {
    public abstract void use();

}

๊ตฌ์ฒดํ™”๋œ ํด๋ž˜์Šค ConcreteProduct์™€ ConcreteCreator

๋‘ ํด๋ž˜์Šค๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์‚ด์„ ๋ถ™์ด๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๋‘ ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ •ํ™•ํžˆ ํ”„๋กœ๋•ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

package part4_factory_method_pattern.id_card_factory;

import part4_factory_method_pattern.framework.Factory;
import part4_factory_method_pattern.framework.Product;

public class IDCardFactory extends Factory {


    @Override
    public IDCard createProduct(String owner) {
        return new IDCard(owner);
    }

    @Override
    public void registerProduct(Product product) {
        System.out.println(product + "์„ ๋“ฑ๋กํ–ˆ์Šต๋‹ˆ๋‹ค.");
    }
}

/*******************************************************/

package part4_factory_method_pattern.id_card_factory;

        import part4_factory_method_pattern.framework.Product;

public class IDCard extends Product {
    private String owner;

    IDCard(String owner) {
        System.out.println(owner + "์˜ ์นด๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.");
        this.owner = owner;
    }

    @Override
    public void use() {
        System.out.println(this + "์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.");
    }

    @Override
    public String toString() {
        return "[IDCard:" + owner + "]";
    }

    public String getOwner() {
        return owner;
    }

}

TemplateMethod์™€ FactodyMethodํŒจํ„ด์˜ ์ฐจ์ด

์ด ๋‚ด์šฉ์€ ํ•„์ž๊ฐ€ ์ง์ ‘ ์ •๋ฆฌํ•˜๋ฉด์„œ ์•ฝ๊ฐ„ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด์–ด์„œ ๊ตณ์ด ๋”ฐ๋กœ ๊ธ€์„ ์จ๋ด…๋‹ˆ๋‹ค. FactoryMethod ํŒจํ„ด์€ ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ์„ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—๊ฒŒ ์˜์กดํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฆ„๋„ Factory๋ผ๊ณ  ๋ถ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Factory๋ผ๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์ฐ์–ด๋‚ด๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์ด๋ฆ„์ด ์ƒ๊ธด ๊ฒƒ์ž…๋‹ˆ๋‹ค. TemplateMehtod ํŒจํ„ด์€ ๊ตฌํ˜„์ฒด์˜ ์ „์ฒด์ ์ธ ํ๋ฆ„ ์ž์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด๋‘๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ถ”์ƒํ™”๋œ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ๋งฅ๋ฝ ์ž์ฒด๋Š” ๊ฐ™์ง€๋งŒ, ๊ฐœ๋…์ด ์ถœ๋ฐœํ•œ ๊ทผ๋ณธ์ด ๋‹ค๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TemplateMethod Pattern : ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ์ด๋‚˜ ํ๋ฆ„์„ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด๋‘๋Š” ๊ฒƒ.
FactoryMethod Pattern : ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์„ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—๊ฒŒ ์˜์กดํ•œ๋‹ค๋Š” ๊ฒƒ.

Factory Method ํŒจํ„ด์˜ ๋“ฑ์žฅ์ธ๋ฌผ

Factory Method ์ด ๋„ค ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ฒซ ์งธ๋กœ Creator์™€ Product๋ฅผ ๋งŒ๋“œ๋Š” ์ถ”์ƒํ™”๋œ ์ƒ์œ„ ํด๋ž˜์Šค์™€ ๊ทธ ๋‘ ํด๋ž˜์Šค๋ฅผ ๊ฐ๊ฐ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌํ˜„์ฒด ConcreteCreator, ConcreteProduct๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์„œ ์ด์•ผ๊ธฐ ํ–ˆ๋“ฏ ๊ด€๊ณ„ ์ •์˜๊ฐ€ 1 : 1๋กœ ๋˜์–ด ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์— ์ฑ…์ž„์„ ์ง€๋Š” ๊ฒƒ์ด FactoryMethodํŒจํ„ด์ž…๋‹ˆ๋‹ค.

์‚ฌ๊ณ  ๋„“ํžˆ๊ธฐ

ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ

์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด ์ถ”์ƒํ™”๋œ ๋‘ ํด๋ž˜์Šค๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ณ  ํ•˜๊ณ , ๊ทธ๋“ค์„ ๊ฐ๊ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์ด๋ผ๊ณ  ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œํ”„๋กœ๊ทธ๋žจ์˜ ๋‚ด์šฉ์„ ๋ณด๋ฉด ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์€ ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜์กดํ•˜์ง€๋งŒ, ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์— ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ์ € Factory๋ผ๋Š” ์ถ”์ƒํ™”๋œ ํด๋ž˜์Šค์™€ Product๋ผ๋Š” ์ถ”์ƒํ™”๋œ ํด๋ž˜์Šค๋กœ ์„œ๋กœ์˜ ์ด์šฉ๊ณผ ๊ด€๊ณ„์— ๋Œ€ํ•ด์„œ๋งŒ ์„ค๊ณ„๋ฅผ ํ•ด์ค€ ๊ฒƒ์ด๊ณ , ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ๊ฐ๊ฐ์˜ Factory์™€ Product๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์ถ”์ƒํ™”๋œ ๋‘ ํด๋ž˜์Šค์˜ ์ด์šฉ๊ณผ ๊ด€๊ณ„๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์•ˆ์— ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ๋“ค์„ ๋‹ด์•„์ค€ ๊ฒƒ์ด์ง€์š”.

์ธ์Šคํ„ด์Šค ์ƒ์„ฑ - ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

Factory ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณด๋ฉด createProduct๋ฅผ ํ• ๋•Œ return new Product(owner) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋†“์„ ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ณ  ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ๊ตณ์ด new Product(owner)๋ฅผ ์“ฐ์ง€ ์•Š์€ ๊ฒƒ์€ ์ด๋ ‡๊ฒŒ ํ•  ๊ฒฝ์šฐ Product ํด๋ž˜์Šค๋ฅผ ํ•ด๋‹น ์ฝ”๋“œ ๋‚ด์—์„œ ์ผ์ผ์ด ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์ถ”์ƒํด๋ž˜์Šค๋กœ ๋‘˜ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ถ”์ƒํ™”๋ผ๋Š” ๊ฐœ๋…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

package part4_factory_method_pattern.framework;

public abstract class Factory {
    public final Product create(String owner) {
        Product p = createProduct(owner);
        registerProduct(p);
        return p;
    }
    protected abstract Product createProduct(String owner);

    protected abstract void registerProduct(Product product);

}

๊ด€๋ จ ํŒจํ„ด

Template Method ํŒจํ„ด
FactoryMethod ํŒจํ„ด์€ Template Method ํŒจํ„ด์˜ ์ „ํ˜•์ ์ธ ์‘์šฉ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์˜ create ๋ฉ”์†Œ๋“œ๊ฐ€ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Singleton ํŒจํ„ด
Creator์—ญ์„ ๋งก๋Š” ํด๋ž˜์Šค๋Š” ๋Œ€๋ถ€๋ถ„ Singleton ํŒจํ„ด์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์•ˆ์—์„œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•  ํ•„์š”๊ฐ€ ๋ณ„๋กœ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹จ, ์ด ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์€ SingletonํŒจํ„ด์œผ๋กœ ๋˜์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Composite ํŒจํ„ด
Product์—ญ์— Composite ํŒจํ„ด์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Iterator ํŒจํ„ด Iterator ํŒจํ„ด์—์„œ iterator ๋ฉ”์†Œ๋“œ๊ฐ€ Iterator ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ Factory Method ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.