๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿคท๐Ÿผ‍โ™€๏ธ Etc.../- ๊ธฐํƒ€

[๊ฐœ๋ฐœ์ž ์ฑ…์ฝ๊ธฐ] Java๋กœ ํ•ด์„ํ•œ GoF ์˜ Design Pattern (์ƒ์„ฑ - ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด)

by Wonit 2022. 3. 7.

ํ•ด๋‹น ๊ธ€์€ Gang of Four์˜ ๋””์ž์ธ ํŒจํ„ด ์ด๋ผ๋Š” ์ฑ…์„ ์ฝ๊ณ  ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ ํ•˜๋Š” ๊ธ€ ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ YES 24 GoF์˜ ๋””์ž์ธ ํŒจํ„ด ์—์„œ ํ™•์ธํ•ด์ฃผ์„ธ์š”.

 

GoF ์˜ ๋””์ž์ธ ํŒจํ„ด - ์žฌ์‚ฌ์šฉ์„ฑ์„ ์ง€๋‹Œ ๊ฐ์ฒด์ง€ํ–ฅ ์†Œํ”„ํŠธ์›จ์–ด์˜ ํ•ต์‹ฌ ์š”์†Œ

 

  • ํ”„๋กœํ… ๋ฏธ๋””์–ด
  • ์ง€์€์ด: ์—๋ฆญ ๊ฐ๋งˆ, ์กด ๋ธ”๋ฆฌ์‚ฌ์ด๋“œ์Šค, ๋ฆฌ์ฒ˜๋“œ ํ—ฌ๋ฆ„, ๋ž„ํ”„ ์กด์Šจ
  • ์˜ฎ๊ธด์ด: ๊น€์ •์•„

 

 


 

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

 

๊ฐ์ฒด๋ฅผ ์ƒˆ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜์ง€๋งŒ, ์–ด๋–ค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ• ์ง€์— ๋Œ€ํ•œ ๊ฒฐ์ •์€ ์„œ๋ธŒ ํด๋ž˜์Šค๊ฐ€ ๋‚ด๋ฆฌ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  • Factory Method ๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ Virtual Constructor ๋ผ๊ณ ๋„ ํ•œ๋‹ค.

 

๋™๊ธฐ

 

์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๋ฌธ์„œ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ์ฒ˜์Œ์—๋Š” PdfDocument ๋งŒ ์กด์žฌํ•ด ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ PDFDocument ์— ์˜์กด์ ์ด๊ฒŒ ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค๊ณ  ํ•˜์ž.

 

ํ•˜์ง€๋งŒ ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ณ  ExcelDocument ์™€ HwpDocument ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ธฐ์กด์— Document ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฐฉ๋ฉด์œผ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

์ฆ‰, ํ˜„์žฌ์˜ ์ฝ”๋“œ๋Š” PdfDocument ์— ์˜์กด์ ์ด๊ฒŒ ๋˜์—ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ ์ด์œ ๋Š” ์ƒ์„ฑ์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค.

 

์ด ๋•Œ ์ƒ์„ฑ์˜ ์ฑ…์ž„๋งŒ์„ ๊ฐ–๋„๋ก ํ•˜๋Š” Factory ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋ฅผ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํŒจํ„ด์— ๋Œ€ํ•ด

 

Factory Method ํŒจํ„ด์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” Client ์—์„œ new ๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Factory ๋ฅผ ํ†ตํ•ด new ์—ฐ์‚ฐ์ž๋ฅผ ๋Œ€์‹  ํ•ด์ฃผ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ตฌํ˜„

 

 

์ฐธ์—ฌ ๊ฐ์ฒด

  • Creator
    • RoleFactory
  • Product
    • Role
  • ConcreteProduct
    • AdminRole
    • MemberRole

 

Factory Class

 

public class RoleFactory {

    public Role createRole(RoleType type) {
        if (RoleType.ADMIN.equals(type)) {
            return new AdminRole();
        } else if (RoleType.MEMBER.equals(type)) {
            return new MemberRole();
        }

        throw new NullPointerException();
    }
}

 

์šฐ์„  Product ๋ฅผ ์ƒ์„ฑํ•˜๋Š” Factory ํด๋ž˜์Šค์ด๋‹ค.

 

ํ•ด๋‹น ํด๋ž˜์Šค์—์„œ๋Š” Role ์„ ์ƒ์„ฑํ•˜๋Š” ํ•œ ๊ฐ€์ง€์˜ ์ฑ…์ž„๋งŒ ์กด์žฌํ•œ๋‹ค

 

์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ์ด ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ด์œ ๋Š” Product ๊ฐ€ ์ถ”๊ฐ€๋  ๋–„ ๋ผ๋Š” ํ•œ ๊ฐ€์ง€ ์ด์œ ๋งŒ ์กด์žฌํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋ณ€๊ฒฝ์ด ๋œ๋‹ค๋ผ๋Š”๊ฒƒ ์ž์ฒด๋Š” ํ•œ ๋ฒˆ ์ƒ๊ฐํ•ด๋ณผ ์—ฌ์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

์ฆ‰, SRP ๋ฅผ ๋งŒ์กฑํ•˜๋‚˜ OCP ๋ฅผ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.

 

Product Class

 

public interface Role {
    String describeRole();
}

public class MemberRole implements Role {

    private String information = "This is Member Role";

    @Override
    public String describeRole() {
        return information;
    }
}

public class AdminRole implements Role {

    private String information = "This is Admin Role";

    @Override
    public String describeRole() {
        return information;
    }
}

public enum RoleType {
    ADMIN, MEMBER
}

 

์œ„์˜ ์ฝ”๋“œ๋“ค์€ Factory ์—์„œ ์ƒ์„ฑํ•˜๊ฒŒ๋  Product ํด๋ž˜์Šค์ด๋‹ค.

 

ConcreteProduct ๋Š” ๋ชจ๋‘ Product ์ธ Role ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

๋งˆ์ง€๋ง‰์— ์กด์žฌํ•˜๋Š” RoleType ์€ Factory ์—์„œ ์ƒ์„ฑํ•  Role ๋“ค์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ๋ถ„์ž์˜ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋Š” Enum ์ด๋‹ค

 

Client

 

public class Client {
    public static void main(String[] args) {
        RoleFactory factory = new RoleFactory();

        Role role = factory.createRole(RoleType.ADMIN);

        System.out.println(role.describeRole());
    }
}

 

ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ๋Š” factory ์—๊ฒŒ RoleType ์„ ๋„˜๊ธฐ๊ฒŒ ๋˜๊ณ  RoleType ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ Role ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๊ฒŒ ๋œ๋‹ค.

 

์žฅ์ ๊ณผ ๋‹จ์ 

 

์žฅ์ 

  • ์ƒ์„ฑ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • SRP ๋ฅผ ์ž˜ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

๋‹จ์ 

  • ๋งŽ์€ Product ์˜ Subclass ๋“ค๋กœ ์ธํ•ด์„œ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

์ •๋ฆฌ

 

์—ฌ๋Ÿฌ ์†Œํ”„ํŠธ์›จ์–ด์—์„œ Factory Method ๋ฅผ ์‹œ์ž‘์œผ๋กœ ์ ์  Abstract Factory ๋‚˜ Prototype ์œผ๋กœ ๋ฐœ์ „ํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ฆ‰, ๋” ๋ณต์žกํ•œ ์ƒ์„ฑ ํŒจํ„ด์˜ ๊ธฐ๋ณธ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์ด๋ฉฐ ๊ฐ€์žฅ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ํŒจํ„ด์ด๋‹ค.

 

GoF ์—์„œ ์†Œ๊ฐœ๋˜๋Š” ๋งŽ์€ ๋””์ž์ธ ํŒจํ„ด๋“ค์ด ๋ชจ๋‘ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š๋‹ค.

 

์—ฌ๋Ÿฌ ํŒจํ„ด๋“ค ์ค‘์—์„œ ๋ช‡๋ช‡ ์œ ์šฉํ•˜๊ณ  ์“ธ๋ชจ์žˆ๋Š” ํŒจํ„ด๋“ค๋งŒ ์ฃผ๋กœ ์‚ฌ์šฉ์ด ๋˜๋Š”๋ฐ, ์ด Factory Method ์—ญ์‹œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ํŒจํ„ด์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

๋Œ“๊ธ€