디자인 패턴은 자주 사용하는 설계패턴을 정형화하여서 유형별로 가장 최적의 방법으로 개발을 할 수 있도록 정해둔 설계알고리즘 및 솔루션(프로젝트의 상황에 따라 맞춰 적용.)
디자인패턴은 많이 존재하지만 다 알 수는 없으니 대표적인 디자인 패턴 (Gang of Four)23개의 패턴이 있음.
즉 객체지향적 개념에 따른 설계 중 재사용할 경우 유용한 설계를 디자인패턴으로 정리해둔 것이다.
(Gang of Four)의 디자인패턴에서는 객체지향적 디자인 패턴의 분류를
생성 패턴(Creational Pattern), 구조 패턴(Structural Pattern), 행동 패턴(Behavioral Pattern) 3가지로 구분하였습니다.
디자인 패턴의 장점
-개발자 간의 원활하게 효율적으로 개발에 협업이 가능하게 도와준다.
-소프트웨어의 구조를 파악하기 용이하다.
-재사용성을 이용하여 개발 시간을 단축할 수 있다.
-설계에 변경요청이 있을 경우 비교적 쉽게 조치가 가능하다.
디자인 패턴의 단점
-객체지향적 설계를 고려하여 진행을 해야함.
-설계 시 고려해야하는 경우가 많기 때문에 초기에 투자비용이 많이들어감(시간,돈,인력)
1.디자인패턴(생성패턴)
-생성패턴은 객체생성과 관련된패턴입니다.
-객체의 생성과 변경이 있을 경우 전체 시스템에 영향을 최소화하며, 코드의 유연성을 높여줌.
디자인패턴 생성패턴의 종류
-Factory Method
-Abstaract Factory
-Builder
-Singleton
-ProtoType
-Factory Method 이란?
객체를 생성하기 위해 인터페이스를 정의를 하는데, 어떤 클래스의 인스턴스를 생성할지의 결정은 서브클래스에서 결정을 하도록 하는경우에 유용하게 사용된다.
말 그대로 객체를 만들어주는 공장? 이라고 생각을 하면 수월할 듯하다
객체 간의 결합도를 낮추고 유지보수를 용이하게 하기 위해서이다.
객체만 생성하는 공장을 통해서 간접적으로 객체를 생성하게 하며
인터페이스를 정의하되, 실제 구현내용은 자식클래스에서 구현이 되므로
세부 구현 코드를 몰라도 부모클래스에서 자유롭게 사용이 가능하여
객체 간의 결합도가 낮아지는 효과를 볼 수 있다.
휴대폰으로 예를 들어보겠습니다.
public interface Phone {
String getPhoneName();
String getPhoneMemory();
}
public class Iphone implements Phone{
private String phoneName;
private String PhoneMemory;
public Iphone(String phoneName, String phoneMemory) {
this.phoneName = phoneName;
this.PhoneMemory = phoneMemory;
}
@Override
public String getPhoneName() {
return this.phoneName;
}
@Override
public String getPhoneMemory() {
return this.PhoneMemory;
}
}
public class SamsungPhone implements Phone{
private String phoneName;
private String PhoneMemory;
public SamsungPhone(String phoneName, String phoneMemory) {
this.phoneName = phoneName;
PhoneMemory = phoneMemory;
}
@Override
public String getPhoneName() {
return this.phoneName;
}
@Override
public String getPhoneMemory() {
return this.PhoneMemory;
}
}
public class PhoneFactory {
public Phone getPhone(String company){
switch (company){
case "apple":
return new Iphone("Iphone", "128G");
case "samsung":
return new SamsungPhone("samsung","258G");
default:
return null;
}
}
}
public class PhoneFactoryTest {
public static void main(String args[]){
PhoneFactory pf = new PhoneFactory();
Phone ip = pf.getPhone("apple");
System.out.println(ip.getPhoneName());
Phone ss = pf.getPhone("samsung");
System.out.println(ss.getPhoneName());
}
}
phone 이라는 인터페이스를 각각 iphone, samsung class가 구현을 하며,
phoneFactory class에서 객체를 구분하여 생성을 합니다.
이렇게 할 경우에는 직접객체를 생성하지않고 중간매개체인 phoneFactory class한 곳에서만 객체를 생성한다.
그러므로 객체들을 관리하기가 쉬워진다. 또한 새로운 class가 추가 및 확장이 되어도 하위 클래스만 추가로 만들어주거나 하면 되기 때문에 확장하기가 수월해진다.
'Spring' 카테고리의 다른 글
DispatcherServlet (1) | 2022.11.11 |
---|---|
ServletContainer SpringContainer (0) | 2022.11.11 |
SPRING MVC.2 (0) | 2021.03.23 |
Spring MVC (0) | 2021.03.22 |
Spring DI (0) | 2021.03.21 |