관리 메뉴

caLAB

[디자인 패턴] 팩토리 패턴 본문

개발 공부/컴퓨터 과학

[디자인 패턴] 팩토리 패턴

도이(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
반응형
Comments