๐ŸŽฐ Design Pattern

Factory Method Pattern | ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด

์—ฐ_์šฐ๋ฆฌ 2022. 7. 29. 21:36
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

     

     

     

    ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์“ฐ์ผ๊นŒ?

    ํ•˜์–€๋ฐฐ๋Š” ํ•˜์–€์ƒ‰๊น”์—, ํ•˜์–€๋งˆํฌ์—, whiteship์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค.

    ๊ฒ€์ •๋ฐฐ๋Š” ๊ฒ€์ •์ƒ‰๊น”์—, ๊ฒ€์ •๋งˆํฌ์—, blackship์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค.

    ๋…ธ๋ž€๋ฐฐ๋Š” ํ•˜์–€๋ฐฐ, ๊ฒ€์ •๋ฐฐ์™€ ๋™์ผํ•œ ์ž‘์—…์— ๋‚ด์šฉ๋ฌผ๋งŒ ๋ฐ”๊พธ์–ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

     

    ๋ฐฐ๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๊ฐ€ if๋ฌธ์œผ๋กœ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ ๋˜์–ด์žˆ์œผ๋ฉด

    ์ดˆ๋ก๋ฐฐ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•  ๊ฒฝ์šฐ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๊ฐ€ 4๊ฐœ๋‚˜ ์ด๋ฃจ์–ด์ง€๊ฒŒ๋˜์–ด ๊น”๋”ํ•œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹๊ฒƒ์ด๊ณ ,

    ๊ณ„์† ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•˜๋‹ˆ ํ™•์žฅ์— ์œ ์—ฐํ•˜์ง€๋„ ์•Š๊ฒŒ๋œ๋‹ค.

     

    ๋ฐฐ์˜ ๊ณตํ†ต์ ์ธ color, mark, name์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŒฉํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜๊ณ ,

    ํŒฉํ† ๋ฆฌ๋กœ๋ถ€ํ„ฐ ํ•˜์–€๋ฐฐ, ๊ฒ€์ •๋ฐฐ, ๋…ธ๋ž€๋ฐฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉด ์–ด๋–จ๊นŒ??

     

     

     

    ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์ด๋ž€?

    ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์ง€๋Š” ์„œ๋ธŒ ํด๋ž˜์Šค๊ฐ€ ์ •ํ•˜๊ฒŒํ•˜๋Š” ํŒจํ„ด์ด๋‹ค

     

    ์žฅ์ 

    - ํ™•์žฅ์— ์—ด๋ ค์žˆ๊ณ  ๋ณ€๊ฒฝ์— ๋‹ซํ˜€์žˆ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์›์น™ OCP๋ฅผ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค

    - ๊ธฐ์กด์˜ ์ฝ”๋“œ, ํŠนํžˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ๊ฑด๋“ค์ด์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

     

     

    ๋‹จ์ 

    - ์ธ์Šคํ„ด์Šค๊ฐ€ ์ถ”๊ฐ€๋ ๋•Œ๋งˆ๋‹ค ํด๋ž˜์Šค ํŒŒ์ผ์ด ๊ณ„์† ์ƒ์„ฑ๋œ๋‹ค

     

     

     

    ๊ตฌํ˜„๋ฐฉ๋ฒ•

    ๊ธฐ์กด์ฝ”๋“œ

    public class ShipFactory {
    
        public static Ship orderShip(String name, String email) {
        
            //validate
            if (name == null || name.isBlank()) {
                throw new IllegalArgumentException("๋ฐฐ ์ด๋ฆ„์„ ์ง€์–ด์ฃผ์„ธ์š”.");
            }
            if (email == null || email.isBlank()) {
                throw new IllegalArgumentException("์—ฐ๋ฝ์ฒ˜๋ฅผ ๋‚จ๊ฒจ์ฃผ์„ธ์š”.");
            }
        
        
            Ship ship = new Ship();
            ship.setName(name);
    
            // Customizing for specific name
            if (name.equalsIgnoreCase("whiteship")) {
                ship.setLogo("\uD83D\uDEE5๏ธ");
            } else if (name.equalsIgnoreCase("blackship")) {
                ship.setLogo("โš“");
            }
    
            // coloring
            if (name.equalsIgnoreCase("whiteship")) {
                ship.setColor("white");
            } else if (name.equalsIgnoreCase("blackship")) {
                ship.setColor("black");
            }
    
            return ship;
        }
    }

     

     

     

    ๋ณ€๊ฒฝ์ฝ”๋“œ

    ShipFactory ํด๋ž˜์Šค๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณ€๊ฒฝํ•˜๊ณ 

    ์ด๋ฆ„, ๋กœ๊ณ , ์ƒ‰๊น”์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค

    public interface ShipFactory {
    
        default Ship orderShip(String name, String email) {
            validate(name, email);
            Ship ship = createShip();
            return ship;
        }
        
        
        //๊ตฌํ˜„ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•  ๋ฉ”์„œ๋“œ
        Ship createShip();
    
        //๊ณตํ†ต์ ์œผ๋กœ ์“ฐ์ด๋Š” ์œ ํšจ์„ฑ๊ฒ€์‚ฌ ๋ฉ”์„œ๋“œ
        private void validate(String name, String email) {
            if (name == null || name.isBlank()) {
                throw new IllegalArgumentException("๋ฐฐ ์ด๋ฆ„์„ ์ง€์–ด์ฃผ์„ธ์š”.");
            }
            if (email == null || email.isBlank()) {
                throw new IllegalArgumentException("์—ฐ๋ฝ์ฒ˜๋ฅผ ๋‚จ๊ฒจ์ฃผ์„ธ์š”.");
            }
        }
        
    }
    public class WhiteshipFactory implement ShipFactory {
    
        @Override
        public Ship createShip() {
            return new Whiteship();
            
            //ํ•ด๋‹น ์˜ˆ์ œ์ฝ”๋“œ์—์„œ๋Š” new Whiteship()์„ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด๋˜์ง€๋งŒ
            //๋งŒ์•ฝ ๋‚˜์ค‘์— ํ•˜์–€์ƒ‰ ๋ฐฐ๋Š” 100kg๊นŒ์ง€ ์ ์žฌํ•ด์•ผํ•˜๊ณ , ๊ฒ€์ •์ƒ‰ ๋ฐฐ๋Š” 150kg๊นŒ์ง€ ์ ์žฌํ•ด์•ผํ•œ๋‹ค๋Š” ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋˜๋ฉด 
            //WhiteshipFactoryํด๋ž˜์Šค์—์„œ validation์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค!
        }
    }
    public class Whiteship extends Ship {
    
        public Whiteship() {
            setName("whiteship");
            setLogo("\uD83D\uDEE5๏ธ");
            setColor("white");
        }
        
    }
    public class Client {
    
        public static void main(String[] args) {
            Client client = new Client();
            client.print(new WhiteshipFactory(), "whiteship", "keesun@mail.com");
            client.print(new BlackshipFactory(), "blackship", "keesun@mail.com");
        }
    
        //ShipFactory๋ฅผ ๋ฐ›๊ธฐ๋•Œ๋ฌธ์— YellowshipFactory๊ฐ€ ์ƒ๊ธด๋‹คํ•ด๋„ print๋ฉ”์„œ๋“œ๋Š” ๋ณ€ํ•จ์ด ์—†๋‹ค
        private void print(ShipFactory shipFactory, String name, String email) {
            System.out.println(shipFactory.orderShip(name, email));
        }
    
    }

     

     

    ์—ฌ๊ธฐ์„œ Blackship์„ ๋งŒ๋“ค๋•Œ, Whiteship์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ด์œ ๊ฐ€ ์žˆ์„๊นŒ??? ์—†๋‹ค!

    Whiteship๊ณผ ๋™์ผํ•˜๊ฒŒ BlackshipFactory, Blackship์„ ์ƒ์„ฑํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค!

    ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ๊ณ  ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์™„์„ฑ๋˜์—ˆ๋‹ค~!

     

     

     

     

     

     

     

     

     

     

    ๋ฐ˜์‘ํ˜•
    • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
    • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
    • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
    • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
    • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ