๐ŸŽฐ Design Pattern

Abstract Factory | ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด

์—ฐ_์šฐ๋ฆฌ 2022. 8. 14. 21:50
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

     

     

     

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

    ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์—์„œ Ship์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์•˜๋‹ค.

    Ship์— Anchor์™€ Wheel ๋ถ€ํ’ˆ์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ ํ•œ๋‹ค

     

    ์ด๋•Œ, Anchor์™€ Wheel์€ ์„œ๋กœ ์ง์ง€์–ด์ง€๋Š” ๋ถ€ํ’ˆ์ด๋‹ค! 

    Anchor - Wheel / AnchorPro - WheelPro / AnchorV2 - WheelV2 ๋กœ ์ง์ง€์–ด์ ธ์„œ ์ถ”๊ฐ€๋˜์–ด์•ผํ•œ๋‹ค

     

    ๊ธฐ์กด ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋ถ€ํ’ˆ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ?

     

     

    ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด๋ž€?

    ์—ฌ๋Ÿฌ ๊ด€๋ จ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ํŒจํ„ด์ด๋‹ค

    ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ฐ์ถœ ์ˆ˜ ์žˆ๊ณ 

    ์„œ๋กœ ์œ ์‚ฌํ•œ ๊ฐ์ฒด๊ฐ€ ์กฐํ•ฉ๋˜์–ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ํŒฉํ† ๋ฆฌ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šคํ™” ํ•˜์—ฌ 

    WhiteAnchor - BlackWheel์˜ ์กฐํ•ฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค!

     

     

     

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

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

    public class WhiteshipFactory implements ShipFactory {
    
        @Override
        public Ship createShip() {
            Ship ship = new Whiteship();
            ship.setAnchor(new WhiteAnchor());
            ship.setWheel(new WhiteWheel());
            return ship;
        }
    }

     

     

     

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

    public class WhiteAnchor implements Anchor{
    }
    
    public class WhiteWheel implements Wheel{
    }
    //โญ ์ถ”์ƒํŒฉํ† ๋ฆฌ
    public interface ShipPartsFactory {
        Anchor createAnchor();
        Wheel createWheel();
    }
    public class WhiteShipPartsFactory implements ShipPartsFactory {
        @Override
        public Anchor createAnchor() {
        	return new WhiteAnchor();
        }
        
        @Override
        public Wheel createWheel() {
        	return new WhiteWheel();   
            //return๊ฐ’์€ ํ•ญ์ƒ Wheel์„ implementsํ•ด์•ผํ•˜๋ฏ€๋กœ ๊ทœ์•…์„ ์ง€ํ‚จ Wheel๋งŒ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๊ฒŒํ•œ๋‹ค
        }
    }
    public class WhiteShipFactory implement ShipFactory {
    
        private ShipPartsFactory shipPartsFactory;
        
        public WhiteShipFactory(ShipPartsFactory shipPartsFactory){
        	this.shipPartsFactory = shipPartsFactory;
        }
        
        @Override
        public ship createShip(){
        	Ship ship = new WhiteShip();
            ship.setAnchor(shipPartsFactory.createAnchor());
            ship.setWheel(shipPartsFactory.createWheel());
            //๐Ÿ”ฅshipPartsFactory์—์„œ ์ด๋ฏธ ์ •ํ•ด์ง„ Anchor์™€ Wheel์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.
            
            return ship;
        }
    }
    ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์ด๋ผ๋ฉด ์œ„ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์•˜์„ ๊ฒƒ์ด๋‹ค.
    ship.setAnchor(new WhiteAnchor());
    ship.setWheel(new WhiteWheel());

    Anchor์™€ Wheel์ด ์ง์ง€์–ด์ ธ์•ผํ•˜๋Š” ์ƒํ™ฉ์—์„œ
    ship.setAnchor(new WhiteAnchor());
    ship.setWheel(new BlackWheel());

    new๋กœ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•œ๋‹ค๋ฉด BlackWheel()์ฒ˜๋Ÿผ ๊ฐ์ฒด๊ฐ€ ์ž˜๋ชป๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค!!!

    ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์—์„œ๋Š” ShipPartsFactory ์ž๋ฆฌ์— ๋ฐ›๋Š”
    WhiteShipPartsFactory์— ์ด๋ฏธ WhiteAnchor(), WhiteWheel()์„ ๋ฐ˜ํ•œํ•˜๋„๋ก ์ง€์ •๋˜์–ด์žˆ์œผ๋‹ˆ 
    ์œ ์‚ฌํ•œ ๊ฐ์ฒด๊ฐ€ ์กฐ๋ฆฝ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    public class Client {
    	public static void main(String[] args){
        	ShipFactory shipFactory = new WhiteShipFactory(new WhitePartsFactory());
            Ship ship = shipFactory.createShip();
            
            System.out.println(ship.getAnchor().getClass());
            //WhiteAnchor
            
            System.out.println(ship.getWheel().getClass());
            //WhiteWheel
        }
    }

     

     

     

     

     

     

    Ummm... ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด๊ณผ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ์ฐจ์ด๋Š”?

    ๊ด€์ ์˜ ์ฐจ์ด

    ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์€ “ํŒฉํ† ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• (inheritance)”์— ์ดˆ์ 

    ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ “ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• (composition)”์— ์ดˆ์ 

     

    ๋ชฉ์ ์˜ ์ฐจ์ด

    ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์€ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด ์ƒ์„ฑ ๊ณผ์ •์„ ํ•˜์œ„ ๋˜๋Š” ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด ๋ชฉ์ .

     => ๊ทธ ์ž์ฒด๋กœ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ

    ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ๊ด€๋ จ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ชฉ์ .

     => ์—ฌ๋Ÿฌ ์œ ์‚ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ์กฐ๋ฆฝํ•˜๋Š” ๊ฒฝ์šฐ

     

     

     

     

     

     

     

    ์ฐธ๊ณ 

    http://daplus.net/java-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%ED%8C%A9%ED%86%A0%EB%A6%AC-vs-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%86%8C%EB%93%9C-vs-%EC%B6%94%EC%83%81-%ED%8C%A9%ED%86%A0%EB%A6%AC/

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