Prototype
2022. 2. 24. 00:00ㆍCSharp/Advance
반응형
코드를 클래스에 종속시키지 않고 기존 개체를 복사할 수 있는 생성 디자인 패턴
**프로토타입 인스턴스를 사용하여 생성할 객체의 종류를 지정하고 이 프로토타입을 복사하여 새로운 객체를 생성**
문제
어떤 개체의 정확한 복사본을 만들고 싶다면.
- 먼저 동일한 클래스의 새 객체를 생성
- 본 개체의 모든 필드를 살펴보고 해당 값을 새 개체에 복사
그러나 일부 필드는 비공개이고 위와 같은 방식으로는 개체 복사가 불가능 하다.
해결책
프로토타입 패턴을 이용하면 복제되는 실제 객체에 복제 프로세스를 위임하여 이를 처리
일반적으로 이러한 인터페이스는 단일 Clone 메서드만 포함
다양한 방식으로 구성된 개체 집합을 만든다.
구성한 것과 같은 개체가 필요할 때 처음부터 새 개체를 구성하는 대신 프로토타입을 복제
예를 위하여 단순히 정의 한것이므로 참고만 바랍니다.
public interface IUnit
{
// 직접구현
IUnit Clone();
// MemberwiseClone 통한 구현
IUnit MemberClone();
}
public abstract class BaseUnit:IUnit
{
protected int _rank { get;init;}
public int HP { get; init; }
public int Power { get; init; }
public abstract IUnit Clone();
public BaseUnit(int hp, int power, int rank)
{
HP = hp;
Power = power;
_rank = rank;
}
public override string ToString()
{
return $"HP = {HP}, Power = {Power}, Rank = {_rank}";
}
public abstract IUnit MemberClone();
}
public class Warrior : BaseUnit
{
public Warrior(int hp, int power, int rank) : base(hp, power, rank)
{
}
public void Attack() => Console.WriteLine("대검으로 공격");
public override IUnit Clone()=> Clone();
public IUnit Clone(int hp=-1, int power=-1, int rank =-1)
{
return new Warrior(hp != -1 ? hp : HP
, power != -1 ? power : Power
, rank != -1 ? rank : _rank);
}
public void Defence() => Console.WriteLine("방패로 방어");
public override IUnit MemberClone()
{
return (IUnit)this.MemberwiseClone();
}
}
사용법
public class Sample
{
public void Clone()
{
var warriorA = new Warrior(1,2,3);
var warriorB = warriorA.Clone(4,5);
var warriorC = warriorA;
warriorC.Child.P = "C";
warriorA.ToString().Print();
warriorB.ToString().Print();
warriorC.ToString().Print();
}
public void MemberClone()
{
var warriorA = new Warrior(1, 2, 3);
var warriorB = warriorA.MemberClone();
var warriorC = warriorA;
warriorA.ToString().Print();
warriorB.ToString().Print();
warriorC.ToString().Print();
}
}
public class Test : ITest
{
public void Run()
{
var sample = new Sample();
sample.Clone();
sample.MemberClone();
}
}
// output (Clone())
HP = 1, Power = 2, Rank = 3
HP = 4, Power = 5, Rank = 3
HP = 1, Power = 2, Rank = 3
// output (MemberClone())
HP = 1, Power = 2, Rank = 3
HP = 1, Power = 2, Rank = 3
HP = 1, Power = 2, Rank = 3
관련영상
반응형
'CSharp > Advance' 카테고리의 다른 글
C# deadlock prevent (0) | 2023.06.23 |
---|---|
Singleton (0) | 2022.02.25 |
Factory Method (0) | 2022.02.23 |
Builder (0) | 2022.02.22 |
Abstract Factory (0) | 2022.02.21 |