책에 있는 예제는 Java 버전이라서 C# 버젼으로 변경해서 작성해보았다.
AbstractFactoryCreateDynamicInstance.zip
namespace AbstractFactoryCreateDynamicInstance.ConcreateFactory
{
public class URL : URLInterFace
{
public Type Spec { get; private set; }
public URL(Type spec)
{
this.Spec = spec;
}
public URLConnection openConnection()
{
URLConnection con = null;
//Connection Class가 추가될 때마다 수정 필요
if (Spec.Equals(typeof(HttpURLConnection)))
{
con = new HttpURLConnection();
}
else if (Spec.Equals(typeof(FtpURLConnection)))
{
con = new FtpURLConnection();
}else
{
con = new OtherURLConnection();
}
return con;
}
public dynamic openConnectionDynamicCreateInstance()
{
//Connection Class가 추가되더라도 수정 불필요
return System.Reflection.Assembly.GetExecutingAssembly().
CreateInstance(Spec.ToString());
}
}
}
class Program
{
static void Main(string[] args)
{
//Factory 생성
URLInterFace url = new URL(typeof(HttpURLConnection));
URLConnection StaticConnetion = url.openConnection();
URLConnection DynamicConnection = url.openConnectionDynamicCreateInstance();
Console.WriteLine(StaticConnetion.connect());
Console.WriteLine(DynamicConnection.connect());
}
}
하드 코딩을 통해 어떤 객체를 생성할지를 결정하게 되면 프로그램이 실행되고 있는 도중에는 행위를 바꾸지 못한다.
=> Reflection을 사용하면 프로그램 실행도중에도 기존에는 없던 새로운 타입의 객체를 생성하도록 할 수 있다.
반면 객체의 생성자에 인자를 전달하기 어려운 것은 동적생성의 단점이다.
=>이 문제를 해결 하려면 스프링을 공부