using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Factory { /* * 카테고리: 생성패턴 * 개요: 객체를 직접 생성하는 대신 생성하는 기능을 가진 Factory 클래스를 통해 객체를 생성함. * * static factory method: 정적 메서드가 클래스 또는 서브클래스를 리턴 * * simple factory: 공식적은 디자인 패턴은 아니지만, 객체를 생성하는 과정이 복잡한 경우 new를 사용하여 팩토리 생성 후 * 클래스 또는 서브클래스를 리턴. * * factory method: 객체를 생성하는 메서드가 구현 클래스가 아닌 인터페이스 또는 추상클래스에 정의됨. * 객체를 생성하는 factory 서브클래스가 여러개일 때 유용. * * abstract factory: 연관되거나 의존적인 여러 클래스 객체들을 생성하기 위한 인터페이스를 제공함. * 여러개의 서로 연관된 객체를 복수 개 생성해야 할 때 유용. */ class Program { static void Main(string[] args) { // static factory method StaticFactoryMethod.ILogger staticFactoryLogger = StaticFactoryMethod.LoggerFactory.Create(StaticFactoryMethod.LoggerType.DB); // simple factory SimpleFactory.LoggerFactory simpleFactory = new SimpleFactory.LoggerFactory(); SimpleFactory.DbLogger simpleFactoryLogger = simpleFactory.CreateDbLogger(); // factory method1 FactoryMethod.LogFactory factoryLogger1 = new FactoryMethod.XmlLogFactory(); factoryLogger1.Log("something to be logged"); // factory method2 FactoryMethod.LogFactory factoryLogger2 = FactoryMethod.LogFactory.GetLogger(); factoryLogger2.Log("something to be logged"); // abstract factory method AbstractFactory.AbstractFactory abstractFactorty = new AbstractFactory.ConcreteFactory2(); AbstractFactory.ProductA prodA = abstractFactorty.CreateProductA(); AbstractFactory.ProductB prodB = abstractFactorty.CreateProductB(); } } }