๊ด€๋ฆฌ ๋ฉ”๋‰ด

deVlog

[๋””์ž์ธ ํŒจํ„ด] ์ƒ์„ฑํŒจํ„ด - Abstract Factory Pattern (์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด) ๋ณธ๋ฌธ

๐Ÿ› ๏ธ Software Architecture/Design Pattern

[๋””์ž์ธ ํŒจํ„ด] ์ƒ์„ฑํŒจํ„ด - Abstract Factory Pattern (์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด)

์€๋ฃจ๋ฐ 2024. 12. 4. 15:22

๋ชฉ์ฐจ

     

    ๐Ÿ“‡ ๊ฐœ์š”

    ๊ด€๋ จ ๊ฐ์ฒด๋“ค์˜ ๊ตฌ์ƒ ํด๋ž˜์Šค๋“ค์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ด€๋ จ ๊ฐ์ฒด๋“ค์˜ ๋ชจ์Œ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ƒ์„ฑํŒจํ„ด์ด๋‹ค.

    • ์„œ๋กœ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฐ์ฒด๋“ค์„ ํ†ต์งธ๋กœ ๋ฌถ์–ด์„œ ์ถ”์ƒํ™”ํ•˜๊ณ , ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด์—์„œ ์ง‘ํ•ฉ์œผ๋กœ ๋ฌถ์€ ๊ฐ์ฒด ๊ตฐ์„ ์ƒ์„ฑํ•œ๋‹ค.
    • ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ํ•ต์‹ฌ์€ ์ œํ’ˆ'๊ตฐ' ์ง‘ํ•ฉ์„ ํƒ€์ž… ๋ณ„๋กœ ์ฐ์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.
    • ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์„ ์ข€ ๋” ์บก์Аํ™”ํ•œ ๋ฐฉ์‹์ด๋‹ค.

     

     

    ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ์ฝ”๋“œ๋กœ ์•Œ์•„๋ณด์ž

    buttons: ์ฒซ ๋ฒˆ์งธ ์ œํ’ˆ์˜ ๊ณ„์ธต๊ตฌ์กฐ

    public interface Button {
        void paint();
    }
    
    public class MacOSButton implements Button {
        @Override
        public void paint() {
            System.out.println("You have created MacOSButton.");
        }
    }
    
    public class WindowsButton implements Button {
        @Override
        public void paint() {
            System.out.println("You have created WindowsButton.");
        }
    }

     

     

    checkboxes: ๋‘ ๋ฒˆ์งธ ์ œํ’ˆ์˜ ๊ณ„์ธต๊ตฌ์กฐ

    public interface Checkbox {
        void paint();
    }
    
    public class MacOSCheckbox implements Checkbox {
        @Override
        public void paint() {
            System.out.println("You have created MacOSCheckbox.");
        }
    }
    
    public class WindowsCheckbox implements Checkbox {
        @Override
        public void paint() {
            System.out.println("You have created WindowsCheckbox.");
        }
    }

     

     

     factories/GUIFactory.java: ์ถ”์ƒ ํŒฉํ† ๋ฆฌ

    // ์ถ”์ƒ ํŒฉํ† ๋ฆฌ
    public interface GUIFactory {
        Button createButton();
        Checkbox createCheckbox();
    }
    
    // ๊ตฌ์ƒ ํŒฉํ† ๋ฆฌ1
    public class MacOSFactory implements GUIFactory {
        @Override
        public Button createButton() {
            return new MacOSButton();
        }
    
        @Override
        public Checkbox createCheckbox() {
            return new MacOSCheckbox();
        }
    }
    
    // ๊ตฌ์ƒ ํŒฉํ† ๋ฆฌ2
    public class WindowsFactory implements GUIFactory {
        @Override
        public Button createButton() {
            return new WindowsButton();
        }
    
        @Override
        public Checkbox createCheckbox() {
            return new WindowsCheckbox();
        }
    }
    • MacOSFacotry, WindowsFactory ๋“ฑ ๊ฐ ๊ตฌ์ƒ ํด๋ž˜์Šค์—์„œ ์ œํ’ˆ๊ตฐ ๋ณ„๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

     

     

    โ˜˜๏ธ ์žฅ/๋‹จ์ 

    ์žฅ์ 

    • ํŒฉํ† ๋ฆฌ์—์„œ ์ƒ์„ฑ๋˜๋Š” ์ œํ’ˆ์˜ ์ƒํ˜ธ ํ˜ธํ™˜์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ตฌ์ƒ ์ œํ’ˆ๋“ค๊ณผ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.
    • ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP) : ์ œํ’ˆ ์ƒ์„ฑ ์ฝ”๋“œ๋ฅผ ํ•œ ๊ณณ์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์œ ์ง€๋ณด์ˆ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ฐœ๋ฐฉ/ํ์‡„ ์›์น™(OCP) : ๊ธฐ์กด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ํ›ผ์†ํ•˜์ง€ ์•Š๊ณ  ์ œํ’ˆ์˜ ์ƒˆ๋กœ์šด ๋ณ€ํ˜•๋“ค์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋‹จ์ 

    • ํŒจํ„ด๊ณผ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋“ค๊ณผ ํด๋ž˜์Šค๋“ค์ด ๋งŽ์ด ๋„์ž…๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ํ•„์š” ์ด์ƒ์œผ๋กœ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค. (ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ๊ณตํ†ต์ ์ธ ๋ฌธ์ œ์ )
    • ๊ธฐ์กด ์ถ”์ƒ ํŒฉํ† ๋ฆฌ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ชจ๋“  ํŒฉํ† ๋ฆฌ์— ๋Œ€ํ•œ ์ˆ˜์ •์ด ํ•„์š”ํ•ด์ง„๋‹ค. ์ด๋Š” ์ถ”์ƒ ํŒฉํ† ๋ฆฌ์™€ ๋ชจ๋“  ๊ตฌ์ƒ ํŒฉํ† ๋ฆฌ์˜ ์ˆ˜์ •์„ ์ดˆ๋ž˜ํ•œ๋‹ค.
    • ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ์ œํ’ˆ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค. ์ƒˆ๋กœ์šด ์ œํ’ˆ์ด ์ถ”๊ฐ€๋˜๋ฉด ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ๋ฐ ๊ตฌ์ƒ ํŒฉํ† ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

     

    ๐Ÿ“‹ ์ฐธ๊ณ