Post

โ›“๏ธ Java Design-Pattern โ…จ - Abstract Factory

โ›“๏ธ Java Design-Pattern โ…จ - Abstract Factory

๐Ÿ“— ใ€ŽJAVA ์–ธ์–ด๋กœ ๋ฐฐ์šฐ๋Š” ๋””์ž์ธ ํŒจํ„ด : ์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๋Š” GoF์˜ 23๊ฐ€์ง€ ๋””์ž์ธ ํŒจํ„ดใ€๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

Absctract Factory ํŒจํ„ด์ด๋ž€?

  • โ€˜์ถ”์ƒ์ ์ธ ๊ณต์žฅโ€™์—์„œ โ€˜์ถ”์ƒ์ ์ธ ๋ถ€ํ’ˆโ€™์„ ์กฐํ•ฉํ•˜์—ฌ โ€˜์ถ”์ƒ์ ์ธ ์ œํ’ˆโ€™์„ ๋งŒ๋“œ๋Š” ํŒจํ„ด์ด๋‹ค.
  • ํ•ด๋‹น ํŒจํ„ด์—์„œ๋Š” ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šคย API์— ์ฃผ๋ชฉํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์‚ฌ์šฉํ•ด์„œ ๋ถ€ํ’ˆ์„ ์กฐ๋ฆฝํ•˜๊ณ  ์ œํ’ˆ์„ ์™„์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • Abstract Factoryย ํŒจํ„ด์—์„œ๋„ ํ•˜์œ„ ํด๋ž˜์Šค ๋‹จ๊ณ„์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
  • ๊ตฌ์ฒด์ ์ธ ๊ณต์žฅ์—์„œ ๊ตฌ์ฒด์ ์ธ ๋ถ€ํ’ˆ์„ ์กฐํ•ฉํ•˜์—ฌ ๊ตฌ์ฒด์ ์ธ ์ œํ’ˆ์„ ๋งŒ๋“ ๋‹ค.

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

  • ๋‹ค์Œ ํ”„๋กœ๊ทธ๋žจ์€ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๋œ ๋งํฌ ํŽ˜์ด์ง€๋ฅผย HTMLย ํŒŒ์ผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ถ”์ƒ์ ์ธ ๊ณต์žฅ, ๋ถ€ํ’ˆ, ์ œํ’ˆ์„ ํฌํ•จํ•˜๋Š”ย factoryย ํŒจํ‚ค์ง€์™€ ๊ตฌ์ฒด์ ์ธ ๊ณต์žฅ, ๋ถ€ํ’ˆ, ์ œํ’ˆ์„ ํฌํ•จํ•˜๋Š”ย listFactoryย ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋‹ค.
  • ์ง€๊ธˆ๊นŒ์ง€๋Š”ย Main.java๋งŒ ์ปดํŒŒ์ผํ•˜๋ฉด ํ•„์š”ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋ชจ๋‘ ์ปดํŒŒ์ผ ๋˜์—ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋Š”ย Main.java๋ฅผ ์ปดํŒŒ์ผํ•˜๋”๋ผ๋„ย ListFactory.java,ย ListLink.java,ย ListTray.java,ย ListPage.java๋Š” ์ปดํŒŒ์ผ ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์™œ๋ƒ๋ฉดย Mainย ํด๋ž˜์Šค๋Š”ย factoryย ํŒจํ‚ค์ง€๋งŒ ์‚ฌ์šฉํ•˜๊ณ ย listFactoryย ํŒจํ‚ค์ง€๋Š” ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๊ทธ๋ž˜์„œ ์†Œ์Šค ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปดํŒŒ์ผ ํ•ด์•ผ ํ•œ๋‹ค.
1
javac Main.java listFactory/ListFactory.java

Itemย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
package factory;

public abstract class Item {
	protected String caption;
    
    public Item(String caption) {
    	this.caption = caption;
    }
    
    public abstract String makeHTML();
}
  • Link,ย Tray์˜ ์ƒ์œ„ ์ถ”์ƒ ํด๋ž˜์Šค์ด๋‹ค.
  • captionย ํ•„๋“œ๋Š” ํ•ญ๋ชฉ์˜ ํ‘œ์ œ์–ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.ย 
  • makeHTMLย ๋ฉ”์†Œ๋“œ๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ์ด๋ฏ€๋กœ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

Linkย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
package factory;

public abstract class Link extends Item {
	protected String url;
    
    public Link(String caption, String url) {
    	super(caption);
        this.url = url;
    }
}
  • ํ•˜์ดํผ๋งํฌ๋ฅผ ์ถ”์ƒ์ ์œผ๋กœ ํ‘œํ˜„ํ•œ ํด๋ž˜์Šค์ด๋‹ค.
  • โ€˜์ถ”์ƒ์ ์ธ ๋ถ€ํ’ˆโ€™์— ํ•ด๋‹นํ•œ๋‹ค.

Trayย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package factory;

import java.util.ArrayList;
import java.util.List;

public abstract class Tray extends Item {
	protected List<Item> tray = new ArrayList<>();
    
    public Tray(String caption) {
    	super(caption);
    }
    
    public void add(Item item) {
    	tray.add(item);
    }
}
  • ๋ณต์ˆ˜์˜ย Link,ย Tray๋ฅผ ๋ชจ์•„์„œ ํ•œ ๊ณณ์— ๋ฌถ๋Š” ํด๋ž˜์Šค์ด๋‹ค.
  • โ€˜์ถ”์ƒ์ ์ธ ๋ถ€ํ’ˆโ€™์— ํ•ด๋‹นํ•œ๋‹ค.

Pageย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package factory;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.List;

public abstract class Page {
	protected String title;
    protected String author;
    protected List<Item> contect = new ArrayList<>();
    
    public Page(String title, String author) {
    	this.title = title;
        this.author = author;
    }
    
    public void add(Item item) {
    	content.add(item);
    }
    
    public void output(String filename) {
    	try {
        	Files.writeString(
            	Path.of(filename), 
            	makeHTML(),
                StandardOpenOption.CREATE,
                StandardOpenOption.TRUNCATE_EXISTING,
                StandardOpenOption.WRITE
            );
            
            System.out.println(filename + "ํŒŒ์ผ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.");
        } catch (IOException e) {
        	e.printStackTrace();
        }
    }
    
    public abstract String makeHTML();
}
  • HTMLย ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ์ถ”์ƒ์ ์œผ๋กœ ํ‘œํ˜„ํ•œ ํด๋ž˜์Šค์ด๋‹ค.
  • ์ฆ‰ โ€˜์ถ”์ƒ์ ์ธ ์ œํ’ˆโ€™์— ํ•ด๋‹นํ•œ๋‹ค.

Factoryย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package factory;

public abstract class Factory {
	public static Factory getFactory(String className) {
    	Factory factory = null;
        
        try {
        	factory = (Factory) Class
            	.forName(className)
                .getDeclaredConstructor()
                .newInstance();
        } catch (ClassNotFoundException e) {
        	System.out.println(className + " ํด๋ž˜์Šค๊ฐ€ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.");
        } catch (Exception e) {
        	e.printStackTrace();
        }
        return factory;
    }
    
    public abstract Link createLink(String caption, String url);
    public abstract Tray createTray(String caption);
    public abstract Page createPage(String title, String author);
}
  • ํŒŒ๋ผ๋ฏธํ„ฐ์˜ย className์—๋Š” ๊ตฌ์ฒด์ ์ธ ๊ณต์žฅ์˜ ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ์ง€์ •ํ•œ๋‹ค.
  • getFactoryย ๋ฉ”์†Œ๋“œ ์•ˆ์—์„œ๋Š”ย Classย ํด๋ž˜์Šค์˜ย forNameย ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์™€,ย getDeclaredConstructorย ๋ฉ”์†Œ๋“œ๋กœ ์ƒ์„ฑ์ž๋ฅผ ์–ป๊ณ ,ย newInstanceย ๋ฉ”์†Œ๋“œ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํด๋ž˜์Šค๋‚˜ ์ƒ์„ฑ์ž ๊ฐ™์€ ์š”์†Œ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ  ํ”„๋กœ๊ทธ๋žจ ์ž์‹ ์ด ๋‹ค๋ฃจ๋Š” ์ฒ˜๋ฆฌ๋ฅผ ๋ฆฌํ”Œ๋ž™์…˜ย reflection์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • getFactoryย ๋ฉ”์†Œ๋“œ์—์„œ๋Š” ๊ตฌ์ฒด์ ์ธ ๊ณต์žฅ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์ง€๋งŒ, ๋ฐ˜ํ™˜๊ฐ’์˜ ํƒ€์ž…์€ ์ถ”์ƒ์ ์ธ ๊ณต์žฅ์ด๋‹ค.

Mainย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import factory.*;

public class Main {
	public static void main(String[] args) {
    	if (args.length() != 2) {
        	System.out.println("Usage : java Main filename.html class.name.of.ConcreteFactory");
           	System.out.println("Example 1 : java Main list.html listFactory.ListFactory");
            System.out.println("Example 2 : java Main div.html divFactory.DivFactory");
            System.exit(0);
        }
        
        String fileName = args[0];
        String className = args[1];
        
        Factory factory = Factory.getFactory(className);
        
        Link blog1 = factory.createLink("Blog 1", "https://example.com/blog1");
        Link blog2 = factory.createLink("Blog 2", "https://example.com/blog2");
        Link blog3 = factory.createLink("Blog 3", "https://example.com/blog3");
        
        Tray blogTray = factory.createTray("Blog site");
        blogTray.add(blog1);
        blogTray.add(blog2);
        blogTray.add(blog3);
        
        Link news1 = factory.createLink("News 1", "http://example.com/news1");
        Link news2 = factory.createLink("News 2", "http://example.com/news2");
        Tray news3 = factory.createLink("News 3");
        news3.add(factory.createLink("News 3 (US)", 	"https://example.com/news3us"));
        news3.add(factory.createLink("News 3 (Korea)", 	"https://example.com/news3kr"));
        
        Tray newsTray = factory.createTray("News Site");
        newTray.add(news1);
        newTray.add(news2);
        newTray.add(news3);
        
        Page page = factory.createPage("Blog and News", "Youngjin.com");
        page.add(blogTray);
        page.add(newsTray);
		
        page.output(fileName);
	}
}
  • ์ถ”์ƒ์ ์ธ ๊ณต์žฅ์„ ์‚ฌ์šฉํ•ด ์ถ”์ƒ์ ์ธ ๋ถ€ํ’ˆ์„ ์ œ์กฐํ•˜๊ณ  ์ถ”์ƒ์ ์ธ ์ œํ’ˆ์„ ์กฐ๋ฆฝํ•œ๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค๋งŒ ๋ชจ์•„ ๋†“์€ย factoryย ํŒจํ‚ค์ง€๋งŒย importํ•˜์—ฌ ์ถ”์ƒ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ ํด๋ž˜์Šค๋Š” ์ „ํ˜€ ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ตฌ์ฒด์ ์ธ ๊ณต์žฅ์˜ ํด๋ž˜์Šค ์ด๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปค๋งจ๋“œ ๋ผ์ธ์—์„œ ์ง€์ •ํ•œ๋‹ค.
1
Java Main list.html listFactory.ListFactory

ListFactoryย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package listFactory;

import factory.Factory;
import factory.Link;
import factory.Page;
import factory.Tray;

public class ListFactory extends Factory {
	@Override
    public Link createLink(String caption, String url) {
    	return new ListLink(caption, url);
    }
    
    @Override
    public Tray createTray(String caption) {
    	return new ListTray(caption);
    }
    
    @Override
    public Page createPage(String title, String author) {
    	return new ListPage(title, author);
    }
}
  • Factoryย ํด๋ž˜์Šค์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œย createLink,ย createTray,ย createPage๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

ListLinkย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package listFactory;

import factory.Link;

public class ListLink extends Link {
	public ListLink(String caption, String url) {
    	super(caption, url);
    }
    
    @Override
    public String makeHTML() {
    	return " <li><a href=\"" + url + "\">" + caption + "</a></li>\n";
    }
}
  • Linkย ์ถ”์ƒ ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ,ย makeHTMLย ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

ListTrayย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package listFactory;

import factory.Tray;
import factory.Item;

public class ListTray extends Tray {
	public ListTray(String caption) {
    	super(caption);
    }
    
    @Override
    public String makeHTML() {
    	StringBuilder sb = new StringBuilder();
        
        sb.append("<li>\n");
        sb.append(caption);
        sb.append("\n<ul>\n");
        
        for (Item item : tray) {
        	sb.append(item.makeHTML());
        }
        
        sb.append("</ul>\n");
        sb.append("</li>\n");
        return sb.toString();
    }
}
  • ๊ฐœ๊ฐœ์˜ย Item์„ ๊ฐœ๋ณ„ย makeHTMLย ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ดย HTMLย ํƒœ๊ทธ๋กœ ๋งŒ๋“ ๋‹ค.
  • ์ด ๋•Œ ๋ณ€์ˆ˜ย item์˜ ๋‚ด์šฉ์ดย ListLink์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€,ย ListTray์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.ย 
  • ListLink,ย ListTray๋Š” ๋ชจ๋‘ย Item์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ด๋ฏ€๋กœย itemย ๋ณ€์ˆ˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์–ด๋–ค ํด๋ž˜์Šค์˜ย makeHTMLย ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•  ์ง€ ์•Œ๊ณ  ์žˆ๋‹ค.

ListPageย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package listFactory;

import factory.Item;
import factory.Page;

public class ListPage extends Page {
	public ListPage(String title, String author) {
    	super(title, author);
    }
    
    @Override
    public String makeHTML() {
    	StringBuilder sb = new StringBuilder();
        sb.append("<!DOCTYPE html>\n");
        sb.append("<html><head><title>");
        sb.append(title);
        sb.append("</title></head>\n");
        sb.append("<body>\n");
        
        sb.append("<h1>");
        sb.append(title);
        sb.append("</h1>\n");
        
        sb.append("<ul>\n");
        for (Item item : content) {
        	sb.append(item.makeHTML());
        }
        sb.append("</ul>\n");
        
        sb.append("<hr><address>");
        sb.append(author);
        sb.append("</address>\n");
        sb.append("</body></html>\n");
        
        return sb.toString();
    }
}
  • for๋ฌธ์—์„œ ์‚ฌ์šฉ๋˜๋Š”ย content๋Š”ย Pageย ํด๋ž˜์Šค์—์„œ ์ƒ์†๋ฐ›์€ ํ•„๋“œ์ด๋‹ค.

DivFactoryย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package divFactory;

import factory.Factory;
import factory.Link;
import factory.Page;
import factory.Tray;

public class ListFactory extends Factory {
	@Override
    public Link createLink(String caption, String url) {
    	return new DivLink(caption, url);
    }
    
    @Override
    public Tray createTray(String caption) {
    	return new DivTray(caption);
    }
    
    @Override
    public Page createPage(String title, String author) {
    	return new DivPage(title, author);
    }
}
  • divXXย ํด๋ž˜์Šค๋Š”ย div,ย styleย ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด ๋””์ž์ธํ•œย HTMLย ๋ฌธ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ตฌํ˜„ ํด๋ž˜์Šค์ด๋‹ค.
  • Factoryย ํด๋ž˜์Šค์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œย createLink,ย createTray,ย createPage๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

DivLinkย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package divFactory;

import factory.Link;

public class DivLink extends Link {
	public DivLink(String caption, String url) {
    	super(caption, url);
    }
    
    @Override
    public String makeHTML() {
    	return "<div class=\"LINK\"><a href=\"" + url + "\">" + caption + "</a></div>\n";
    }
}
  • Linkย ์ถ”์ƒ ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ,ย makeHTMLย ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

DivTrayย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package divFactory;

import factory.Tray;
import factory.Item;

public class DivTray extends Tray {
	public DivTray(String caption) {
    	super(caption);
    }
    
    @Override
    public String makeHTML() {
    	StringBuilder sb = new StringBuilder();
        
        sb.append("<p><b>");
        sb.append(caption);
        sb.append("</b></p>\n");
        sb.append("<div class=\"TRAY>\">");
        
        for (Item item : tray) {
        	sb.append(item.makeHTML());
        }
        
        sb.append("</div>\n");
        
        return sb.toString();
    }
}

DivPageย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package divFactory;

import factory.Item;
import factory.Page;

public class DivPage extends Page {
	public DivPage(String title, String author) {
    	super(title, author);
    }
    
    @Override
    public String makeHTML() {
    	StringBuilder sb = new StringBuilder();
        sb.append("<!DOCTYPE html>\n");
        sb.append("<html><head><title>");
        sb.append(title);
        sb.append("</title><style>\n");
        
        sb.append("</style></head><body>\n");
        
        sb.append("<h1>");
        sb.append(title);
        sb.append("</h1>\n");
        
        for (Item item : content) {
        	sb.append(item.makeHTML());
        }
        
        sb.append("<hr><address>");
        sb.append(author);
        sb.append("</address>\n");
        sb.append("</body></html>\n");
        
        return sb.toString();
    }
}
  • for๋ฌธ์—์„œ ์‚ฌ์šฉ๋˜๋Š”ย content๋Š”ย Pageย ํด๋ž˜์Šค์—์„œ ์ƒ์†๋ฐ›์€ ํ•„๋“œ์ด๋‹ค.

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

Link,ย Tray,ย Pageย ํด๋ž˜์Šค

  • ์ถ”์ƒ์ ์ธ ์ œํ’ˆย AbstractProductย ์—ญํ• ์„ ๋งก์•„ ์ถ”์ƒ์ ์ธ ๋ถ€ํ’ˆ์ด๋‚˜ ์ œํ’ˆ์˜ ์ธํ„ฐํŽ˜์ด์Šคย API๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

Factoryย ํด๋ž˜์Šค

  • ์ถ”์ƒ์ ์ธ ๊ณต์žฅย Abstract Factoryย ์—ญํ• ์„ ๋งก์•„ ์ถ”์ƒ์ ์ธ ์ œํ’ˆ ์—ญํ• ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šคย API๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

Mainย ํด๋ž˜์Šค

  • ์ถ”์ƒ์ ์ธ ์ œํ’ˆ์ด๋‚˜ ์ถ”์ƒ์ ์ธ ๊ณต์žฅ ์—ญํ• ์˜ ์ธํ„ฐํŽ˜์ด์Šคย API๋งŒ ์‚ฌ์šฉํ•ด ์ž‘์—…ํ•œ๋‹ค.
  • ๊ตฌ์ฒด์ ์ธ ์ œํ’ˆ์ด๋‚˜ ๊ตฌ์ฒด์ ์ธ ๊ณต์žฅ์— ๋Œ€ํ•ด์„œ๋Š” ๋ชจ๋ฅธ๋‹ค.

ListLinkย โ€ฆย ListPage,ย DivLinkย โ€ฆย DivPageย ํด๋ž˜์Šค

  • ๊ตฌ์ฒด์ ์ธ ์ œํ’ˆย ConcreteProductย ์—ญํ• ์„ ๋งก์•„ ์ถ”์ƒ์ ์ธ ์ œํ’ˆ ์—ญํ• ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

ListFactory,ย DivFactoryย ํด๋ž˜์Šค

  • ๊ตฌ์ฒด์ ์ธ ๊ณต์žฅย ConcreteFactoryย ์—ญํ• ์„ ๋งก์•„ ์ถ”์ƒ์ ์ธ ๊ณต์žฅ ์—ญํ• ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

์ฑ…์—์„œ ์ œ์‹œํ•˜๋Š” ํžŒํŠธ

๊ตฌ์ฒด์ ์ธ ๊ณต์žฅ์„ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑด ๊ฐ„๋‹จํ•˜๋‹ค.

  • ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์ฒ˜๋Ÿผ ํ•ด์•ผํ•  ์ผ์€ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ํด๋ž˜์Šค ๋‚ด ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ผ ๋ฟ์ด๋‹ค.
  • ์•„๋ฌด๋ฆฌ ๊ตฌ์ฒด์ ์ธ ๊ณต์žฅ์„ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ ์ถ”์ƒ์ ์ธ ๊ณต์žฅ์ด๋‚˜ย Mainย ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•  ํ•„์š”๋Š” ์ „ํ˜€ ์—†๋‹ค.

๋ถ€ํ’ˆ์„ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑด ์–ด๋ ต๋‹ค.

  • ๊ฐ€๋ น ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ถ”์ƒ์ ์ธ ๊ณต์žฅ์—ย Picture๋ผ๋Š” ๋ถ€ํ’ˆ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๊ตฌ์ฒด์ ์ธ ๊ณต์žฅ ์ „๋ถ€๋ฅผย Picture์— ๋Œ€์‘ํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•

  • newย ์˜ˆ์•ฝ์–ด
  • cloneย ๋ฉ”์†Œ๋“œ
  • newInstanceย ๋ฉ”์†Œ๋“œ:ย Class์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ทธย Class๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
This post is licensed under CC BY 4.0 by the author.