개발 공부/컴퓨터 과학
[디자인 패턴] 팩토리 패턴
도이(doi)
2021. 7. 2. 10:09
728x90
팩토리 패턴이란?
Factory method는 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며. 자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이다.
코드
1. 상속 사용 / 공장 1개 제품 다수
using System;
using System.Collections.Generic;
namespace factoryPattern_simple
{
class Program
{
static public List<Product> pList = new List<Product>();
static public List<Creator> cList = new List<Creator>();
static void Main(string[] args)
{
//생성자 생성
Creator c = new Creator();
//주문 생성
productCreate(c, "productA");
productCreate(c, "productB");
productCreate(c, "productC");
//최종 주문 관련 리스트 출력
Console.WriteLine("\nprint out product list.");
for (int i = 0; i < pList.Count; i++)
{
Console.WriteLine(i + "\nproduct :" + pList[i] + "\ncreator :" + cList[i]);
}
}
//제품 생산 및 리스트 추가
static public void productCreate(Creator creator, string product)
{
var _product = creator.order(product);
pList.Add(_product);
cList.Add(creator);
}
}
//제품
public class Product
{
//프로덕트들이 공유하는 함수
public void Do()
{
Console.WriteLine("do nothing");
}
}
class ProductA : Product
{
public int ID;
public ProductA(int id)
{
this.ID = id;
}
//productA 함수
public void make()
{
Console.WriteLine("this is productA make");
}
}
class ProductB : Product
{
public int ID;
public ProductB(int id)
{
this.ID = id;
}
//productB 함수
public void make()
{
Console.WriteLine("this is productB make");
}
}
class ProductC : Product
{
public int ID;
public ProductC(int id)
{
this.ID = id;
}
//productC 함수
public void make()
{
Console.WriteLine("this is productC make");
}
}
//생성자
class Creator
{
int a_id = 0;
int b_id = 0;
int c_id = 0;
public Product order(String message)
{
Console.WriteLine("CreatorA gets order.");
if (message == "productA")
{
a_id++;
return new ProductA(a_id);
}
if (message == "productB")
{
b_id++;
return new ProductB(b_id);
}
if (message == "productC")
{
c_id++;
return new ProductC(c_id);
}
return null;
}
}
}
2. abstract 사용 / 공장 다수 제품 다수
using System;
using System.Collections.Generic;
namespace factoryPattern_simple
{
class Program
{
static public List<Product> pList = new List<Product>();
static public List<Creator> cList = new List<Creator>();
static void Main(string[] args)
{
//생성자 생성
CreatorA ca = new CreatorA();
CreatorB cb = new CreatorB();
//주문 생성
productCreate(ca, "productA");
productCreate(cb, "productB");
productCreate(ca, "productC");
productCreate(cb, "productA");
productCreate(cb, "productB");
productCreate(ca, "productC");
//최종 주문 관련 리스트 출력
Console.WriteLine("\nprint out product list.");
for(int i = 0; i < pList.Count; i++)
{
Console.WriteLine(i + "\nproduct :" + pList[i] + "\ncreator :" + cList[i]);
}
}
//제품 생산 및 리스트 추가
static public void productCreate(Creator creator, string product)
{
var _product = creator.order(product);
pList.Add(_product);
cList.Add(creator);
}
}
//제품
abstract class Product
{
public abstract void make();
}
class ProductA : Product
{
public override void make() => Console.WriteLine("productA make");
}
class ProductB : Product
{
public override void make() => Console.WriteLine("productB make");
}
class ProductC : Product
{
public override void make() => Console.WriteLine("productC make");
}
//생성자
abstract class Creator
{
public abstract Product order(String message);
}
class CreatorA : Creator
{
public override Product order(String message)
{
Console.WriteLine("CreatorA gets order.");
if (message == "productA")
return new ProductA();
if (message == "productB")
return new ProductB();
if (message == "productC")
return new ProductC();
return null;
}
}
class CreatorB : Creator
{
public override Product order(String message)
{
Console.WriteLine("CreatorB gets order.");
if (message == "productA")
return new ProductA();
if (message == "productB")
return new ProductB();
if (message == "productC")
return new ProductC();
return null;
}
}
}
728x90
반응형