한 편 이면 충분 합 니 다. 디자인 모델 (1) - 공장 모델.
Simple Factory Pattern
, 정적 공장 모델 Static Factory Pattern
, 공장 방법 모델 Factory Method Pattern
, 추상 적 인 공장 모델 Abstract Factory Pattern
이다.디자인 모델 을 배 울 때 억지로 유형 도 를 옮 기지 말고 이런 모델 의 사상 을 배우 고 이런 문 제 를 어떻게 해결 하 는 지 주목 하 는 것 이 좋 습 니 다. 그래서 뒤의 것 은 모두 이 두 가지 목적 으로 자신의 소감 을 공유 하 는 것 입 니 다.
아래 의 예 가 적절 하지 않 으 니 공장 모델 을 이해 할 수 있 으 면 된다.친 구 는 청 두에 찻집 을 열 어 찻잎 관리 시스템 을 만 들 려 고 한다.지금 은 수 요 를 간단하게 분석 하고 이 시스템 에 간단 한 주문 기능 을 추가 하면 고객 이 차 를 살 때 클 라 이언 트 를 통 해 주문 할 수 있다.
먼저 간단 한 버 전 을 만 들 고
TeaStore
을 통 해 서로 다른 유형의 차 에 따라 주문 합 니 다.fun main(args: Array)
{
val redStore:TeaStore = TeaStore()
redStore.order(TeaStore.TeaType.RED).getTea()
redStore.order(TeaStore.TeaType.GREEN).getTea()
}
새로 만 든
TeaStore
그리고 손님 은 홍차 한 잔, 녹차 한 잔 을 주문 했다.아래 코드 에서 볼 수 있 듯 이 현재 시스템 은 홍차 와 녹차 밖 에 없다.class TeaStore
{
enum class TeaType
{
RED,
GREEN,
BLACK,
YELLOW,
}
/**
*
*/
fun order(type: TeaType): Tea
{
val tea = when (type)
{
TeaType.RED -> RedTea()
TeaType.GREEN -> GreenTea()
}
tea.addWater()
tea.cook()
return tea
}
}
현재 고객 이 가게 에서 황 차 를 마 실 수 있 기 를 원 하기 때문에 시스템 은 황 차 유형 을 지원 해 야 한다. 이때 우 리 는 이렇게 수정 할 수 있다
TeaStroe
. /**
*
*/
fun order(type: TeaType): Tea
{
val tea = when (type)
{
TeaType.RED -> RedTea()
TeaType.GREEN -> GreenTea()
TeaType.YELLOW -> YellowTea() //
}
tea.addWater()
tea.cook()
return tea
}
이제 주문 할 때 황차 타 입 을 추가 할 수 있 습 니 다.문 제 는 차 를 추가 할 때마다 switch 안의 조건 을 수정 해 야 한 다 는 점 이다. 분명히 개폐 원칙 에 부합 되 지 않 는 다.
단순 공장 모드
아 날로 그 는 목적 이 아니 라 이해 에 만 도움 을 줍 니 다. [이미지 업로드 실패... (image - e21af9 - 1527174175649)]
간단 한 공장 은 매번 직접 소비 류 의 코드 를 수정 하 는 것 을 해결 할 수 있다.다음은 간단 한 공장 모델 로 하나의 버 전 을 실현 하고 공장 으로
Tea
류 의 사례 를 생산 한다.class SimpleFactory
{
/**
*
*/
fun createTea(type: TeaStore.TeaType): Tea
{
return when (type)
{
TeaStore.TeaType.RED -> RedTea()
TeaStore.TeaType.GREEN -> GreenTea()
else -> NoneTea()
}
}
}
그리고 다음 코드 를 수정 하여 공장 생 성 클래스 를 사용 합 니 다.
/**
*
*/
fun order(type: TeaType): Tea
{
val tea = SimpleFactory.createTea(type)
tea.addWater()
tea.cook()
return tea
}
현재 swith 대신 간단 한 공장
Tea
류 를 만 들 고 있 습 니 다.어, 잠깐 만, 지금 내 가 차 를 하나 첨가 하려 고 할 때 어 떡 하지?공장 류 SimpleFactory
를 열 고 swith 지점 을 계속 추가 합 니 다.이상 할 거 야. 이 건 예전 과 똑 같 잖 아. 다른 곳 에서 수정 한 거 야. 여기 TeaStroe
만 생산 소비 Tea
와 같은 사례 가 있어. 만약 에 100 곳 이 있다 면?디자인 모델 이 하고 있 는 일 은 딱 하나 입 니 다. 포장 변화, 항상 변화 하 는 코드 를 블랙박스 에 밀봉 하여 전체적으로 변 하지 않 게 합 니 다.
간단 한 공장 모델 이 해결 하 는 문 제 는 바로 포장 창설 류 의 변화 이다.
Tea
유형의 수정 을 공장 류 에서 통제 하고 공장 류 를 사용 하여 발생 하 는 Tea
사례 를 사용 하 는 곳 은 더 이상 수정 할 필요 가 없다.마지막 으로 간단 한 공장 모델 과 정태 적 인 공장 모델 의 차 이 를 설명 한다. 만약 에
createTea()
을 정태 적 인 방법 으로 실현 하면 정태 적 인 공장 모델 이 고 유형 화 된 방법 을 실현 하면 간단 한 공장 모델 이다.우리 시스템 을 사용 하여 찻집 의 효율 이 향상 되 어 많은 돈 을 벌 었 습 니 다. 지금 은 소프트웨어 원 에 지점 을 열 었 습 니 다. 서로 다른 사람들 이 가게 마다 다른 차 를 파 는 것 에 적응 하기 위해 소프트웨어 원 에서 차 를 팔 고 다른 도 핑 제 를 추 가 했 습 니 다. 코드 홍차 (코드 를 쓰 고 bug 가 없 음) 와 코드 녹 차 를 마 셨 습 니 다. 예전 의 가 게 는 동쪽 에서 직접 동 점 이 라 고 부 르 고 일반 홍차 와 일반 녹 차 를 팔 았 습 니 다.이전의 방식 은 차 에 대한 수정 만 만족 시 킬 수 있 을 뿐 찻집 의 확장 에 만족 하지 못 했다.
공장 방법 모델
공장 방법 모드 (영어: Factory methodpattern) 는 다른 생 성 모드 와 마찬가지 로 대상 의 구체 적 인 유형 을 지정 하지 않 은 상태 에서 대상 을 만 드 는 문 제 를 처리 합 니 다.공장 방법 모델 의 실질 은 "창설 대상 의 인 터 페 이 스 를 정의 하지만, 이 인 터 페 이 스 를 실현 하 는 클래스 로 하여 금 어떤 클래스 를 실례 화 할 것 인 지 를 결정 하 게 하 는 것 이다. 공장 방법 은 클래스 의 실례 화 를 하위 클래스 로 미 루 게 한다."
아 날로 그 는 목적 이 아니 라 이해 에 만 도움 이 된다.
[사진 업로드 실패... (image - 485 df - 1527174175650)] 아 날로 그 에서 보 듯 이 우 리 는 차 를 만 드 는 방법 을 찻집 에 두 었 고 추상 적 인 찻집
TeaStore
이 있 으 며 Tea
인 스 턴 스 를 만 드 는 방법 을 TeaStroe
의 하위 클래스 에 두 었 다.abstract class TeaStore
{
enum class TeaType
{
RED,
GREEN,
BLACK,
YELLOW,
}
/**
*
*/
fun order(type: TeaType): Tea
{
val tea: Tea = createTea(type)
print("
--------------------")
tea.addWater()
tea.cook()
return tea
}
//
abstract protected fun createTea(type: TeaType): Tea
}
추상 적 인 찻집 을 바탕 으로 두 지역 의 찻집 을 실현 한다.
class SoftTeaStore : TeaStore()
{
override fun createTea(type: TeaType): Tea
{
return when (type)
{
TeaType.RED -> CodeRedTea()
TeaType.GREEN -> CodeGreenTea()
else -> NoneTea()
}
}
}
class EastTeaStore : TeaStore()
{
override fun createTea(type: TeaType): Tea
{
return when (type)
{
TeaType.RED -> RedTea()
TeaType.BLACK -> BlackTea()
TeaType.GREEN -> GreenTea()
else -> NoneTea()
}
}
}
소프트웨어 원 의 찻집 에서 산 홍 차 는 코드 홍차 이 고 녹 차 는 코드 녹차 이 며 동 점 에서 파 는 것 은 보통 차 입 니 다.지금 이 두 가게 로 각각 차 한 잔 을 주문 합 니 다.
fun main(args: Array)
{
val redStore:TeaStore = EastTeaStore()
//
redStore.order(TeaStore.TeaType.RED).getTea()
val greenStore: TeaStore = SoftTeaStore()
//
greenStore.order(TeaStore.TeaType.GREEN).getTea()
}
소프트웨어 원 의 홍 차 는 고객 이 도 핑 제 를 첨가 한 홍 차 를 받 았 고, 동점 에서 받 은 홍 차 는 일반 녹차 다.지금 차 를 추가 하면 소프트웨어 원 이 든 동점 이 든 예전 과 마찬가지 로 공장 방법 만 수정 해 야 한다. 예전 과 달리 지금 은 지역 에 따라 다른 차 를 확장 할 수 있 을 뿐만 아니 라 새로운 가게 도 추가 할 수 있다. 예 를 들 어 북 점, 검 은 가게 등 이다. 우리 의 고객 측 Main 은 tea 를 소비 하 는 곳 이다. 수정 하지 않 아 도 된다.
추상 공장 모드
추상 적 인 공장 모델 (영어: Abstract factory pattern), 추상 적 인 공장 모델 은 하나의 방식 을 제공 하여 같은 주 제 를 가 진 단독 공장 을 포장 할 수 있다.
아 날로 그 는 목적 이 아니 라 이해 에 만 도움 이 된다.그래서 지금 차 를 우려 내 는 물 등 은 지역 별로 따로 제공 해 야 합 니 다. 그러면 우리 공장 은 일련의 재 료 를 생산 해 야 합 니 다. 공장 방법 모델 과 마찬가지 로 물 을 만 드 는 공장 방법 이 많아 졌 을 뿐 입 니 다.
class SoftTeaStore : TeaStore()
{
//
override fun createTea(type: TeaType): Tea
{
return when (type)
{
TeaType.RED -> CodeRedTea()
TeaType.GREEN -> CodeGreenTea()
else -> NoneTea()
}
}
//
override fun createWater(type: WaterType) : Water
{
return when (type)
{
WaterType.WHITE -> WhiteWater()
WaterType.NORMAL -> NormalWater()
else -> NoneWater()
}
}
}
이렇게 되면 일련의 공 예 를 한 공장 에 제한 하면 동 점 에서 생수 를 사용 하 는 상황 이 나타 나 지 않 고 절차 와 생산 업 체 의 시험 도 규범화 시 킬 수 있다.같은 차 나 찻집 이 새로 생 겨 수요 에 따라 다양한 찻집 을 쉽게 만 들 수 있다.
총결산
요약 하면 가끔 은 클래스 의 생 성과 초기 화가 비교적 무 겁 기 때문에 사용 하 는 곳 마다 실례 화 를 하면 중복 코드 가 많이 발생 하고 공장 모델 은 클래스 를 통일 적 으로 만 들 고 초기 화 할 수 있 습 니 다.공장 모델 은 4 가지 로 나 뉜 다. 간단 한 공장 모델, 정태 공장 모델, 공장 방법 모델, 추상 적 인 공장 모델 이다.그 중에서 간단 한 공장 모델, 정태 적 인 공장 모델 의 차 이 는 창설 방법 을 어떤 방식 으로 실현 하 는 지 에 있다. 공장 방법 모델 은 창설 을 하위 클래스 로 지연 시 켜 진행 하 는 것 이 고 추상 적 인 공장 모델 은 일련의 공장 방법의 조합 이다.그들 은 서로 다른 문 제 를 해결 했다. 간단 한 공장 과 정태 적 인 공장 은 주로 유형 이 일치 하지 않 고 코드 를 반복 하 는 것 을 해결 했다. 공장 방법 은 주로 서로 다른 유형 에 대해 서로 다른 사례 를 만 들 수 있 고 추상 적 인 공장 이 주로 해결 하 는 문 제 는 일련의 공장 측 법 에 대한 포장, 절차 상의 규범 적 인 확장 이다.
더 보기
높 은 산 에 오 르 지 않 으 면 하늘 이 높 은 줄 모른다.깊 은 시내 에 임 하지 않 고 땅 이 두 꺼 운 줄 도 모 르 고 조언, 교류, 사랑 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.