Factory Method Pattern

https://www.dofactory.com/images/diagrams/net/factory.gif

ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์€ Super Class์— ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒจํ„ด์ด๋ฉฐ, ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋„๋ก ํ•˜๋Š” ํŒจํ„ด์ด๊ธฐ๋„ ํ•˜๋‹ค.

์ฆ‰, ๊ฐ์ฒด ์ƒ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ์„œ๋ธŒ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌ ํ•ด ์ฒ˜๋ฆฌํ•˜๋„๋ก ์บก์Аํ™”ํ•˜๋Š” ํŒจํ„ด ์œผ๋กœ ๊ฐ์ฒด์˜ ์ƒ์„ฑ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ํด๋ž˜์Šค/๋ฉ”์„œ๋“œ๋กœ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ๊ฐ์ฒด ์ƒ์„ฑ์˜ ๋ณ€ํ™”์— ๋Œ€๋น„ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.

์ฃผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ Super Class์—์„œ๋Š” Sub Class์—์„œ ์ •ํ™•ํžˆ ์–ด๋–ค ํด๋ž˜์Šค์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ• ์ง€ ์•Œ์ง€ ๋ชปํ•œ๋‹ค.

public interface Shape{
  abstract void draw();
}
public class Star extends Shape{
  @Override
  public void draw(){
    System.out.println("๋ณ„ ๊ทธ๋ฆฌ๊ธฐ");
  }
}
public class Square extends Shape{
  @Override
  public void draw(){
    System.out.println("๋„ค๋ชจ ๊ทธ๋ฆฌ๊ธฐ");
  }
}
public class ShapeFactory{
  public Shape getShape(String shapeType){
    if(StringUtils.isEmpty(shapeType)){
      return null;
    }
    if(shapeType.equalsIgnoreCase("SQUARE")){
      return new Square();
    }else if(shapeType.equalsIgnoreCase("STAR")){
      return new Star();
    }
        return null;
  }
}
public FactoryPatternTest{
  public static void main(String[] args){
    ShapeFactory shapeFactory = new ShapeFactory();

    Shape shape1 = shapeFactory.getShape("STAR");
    shape1.draw();

    Shape shape2 = shapeFactory.getShape("SQUARE");
    shape2.draw();
  }
}

์ฆ‰, ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ ๋ฐฉ๋ฒ• ํด๋ž˜์Šค๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋‘” ๋ฉ”์†Œ๋“œ๋ฅผ ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ๋ผ๊ณ  ํ•˜๋ฉฐ, ์ด ๋ฐฉ์‹์„ ํ†ตํ•ด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์ด๋ผ๊ณ  ํ•œ๋‹ค.

Factory Method Pattern์„ ์™œ ์‚ฌ์šฉํ• ๊นŒ?

ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ํด๋ž˜์Šค๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•œ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒฐํ•ฉ๋„๋ผ๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํžˆ ๋งํ•ด ํด๋ž˜์Šค์˜ ๋ณ€๊ฒฝ์ ์ด ์ƒ๊ฒผ์„ ๋•Œ ์–ผ๋งˆ๋‚˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—๋„ ์˜ํ–ฅ์„ ์ฃผ๋Š”๊ฐ€์ž…๋‹ˆ๋‹ค. ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์„œ๋ธŒ ํด๋ž˜์Šค์— ์œ„์ž„ํ•จ์œผ๋กœ์จ ๋ณด๋‹ค ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ œ์–ด๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ณ  ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฒฐํ•ฉ๋„ ๋˜ํ•œ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ

Sub Class์˜ getConnection()์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ Connection ์ข…๋ฅ˜๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์˜ ์˜ˆ์‹œ์ด๋‹ค.

package springbook.user.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import springbook.user.domain.User;

public abstract class UserDao {
    public void add(User user) throws ClassNotFoundException, SQLException {
        Connection c = getConnection();

        PreparedStatement ps = c.prepareStatement(
            "insert into users(id, name, password) values(?,?,?)");
        ps.setString(1, user.getId());
        ps.setString(2, user.getName());
        ps.setString(3, user.getPassword());

        ps.executeUpdate();

        ps.close();
        c.close();
    }


    public User get(String id) throws ClassNotFoundException, SQLException {
        Connection c = getConnection();
        PreparedStatement ps = c
                .prepareStatement("select * from users where id = ?");
        ps.setString(1, id);

        ResultSet rs = ps.executeQuery();
        rs.next();
        User user = new User();
        user.setId(rs.getString("id"));
        user.setName(rs.getString("name"));
        user.setPassword(rs.getString("password"));

        rs.close();
        ps.close();
        c.close();

        return user;
    }

    abstract protected Connection getConnection() throws ClassNotFoundException, SQLException ;

}
package springbook.user.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DUserDao extends UserDao {
    protected Connection getConnection() throws ClassNotFoundException,
            SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection c = DriverManager.getConnection(
                "jdbc:mysql://localhost/springbook?characterEncoding=UTF-8",
                "DuserId", "DUserPassword");
        return c;
    }
}
package springbook.user.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class NUserDao extends UserDao {
    protected Connection getConnection() throws ClassNotFoundException,
            SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection c = DriverManager.getConnection(
                "jdbc:mysql://localhost/springbook?characterEncoding=UTF-8",
                "NUserId", "NUserPassword");
        return c;
    }
}
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        UserDao dao = new NUserDao();

        User user = new User();
        user.setId("admin");
        user.setName("test1");
        user.setPassword("admintest");

        dao.add(user);

        System.out.println(user.getId() + " ๋“ฑ๋ก ์™„๋ฃŒ");

        User user2 = dao.get(user.getId());
        System.out.println(user2.getName());
        System.out.println(user2.getPassword());

        System.out.println(user2.getId() + " ํ˜ธ์ถœ ์™„๋ฃŒ");
    }

NUserDao์™€ DUserDao๊ฐ€ Connection์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋ฏ€๋กœ, ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ 

Last updated

Was this helpful?