관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[디자인패턴] Design Pattern 요약 및 참고 모음 본문

디자인패턴

[디자인패턴] Design Pattern 요약 및 참고 모음

막무가내막내 2020. 5. 26. 20:07
728x90

 

 

 

 

 

 

가볍고 쉽게 읽고 이해할 수 있는 디자인패턴 설명 예시 사이트를 정리하는 포스팅입니다.  

궁금할 때 볼 사이트 정리를 위해 포스팅합니다.

 

 

1. 빌더 패턴 ( Builder Pattern)

빌더 패턴(Builder pattern)이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다. [위키디피아 참고]

 

 

[간단요약]

빌더 -> 생성자매개변수에 해당하는 값 set 받음 -> 빌드 (객체[생성자] 반환)

 

ex) 객체 생성 시 너무 많은  매개변수가 있으면 순서도 햇갈리고 데이터가 없는 경우는 null 로 넘겨주고 아무토록 코드 유지보수 및 가독성이 안좋습니다. (순서 실수하기도 쉽고) (코드 유지보수의 예로는 매개변수 하나만 늘어도 코드를 바꿀때가 엄청 많아 질 것 입니다.)

 

그래서 빌더 클래스를 하나 만들어 기존 객체가 자신의 생성자를 통해 직접 생성하던걸 대신해줍니다. 빌더 클래스에서 생성할 클래스 생성자에 맞는 값들을 setter 로 받고 build() 메소드를 setter로 받은 매개변수들과 나머지 값들 모두 조합해 반환할 객체를 짜잔 하고 말그대로 만들어(빌드) 줍니다. 빌더의 어떤 값이 어떻게 set 됬든 일관성있게 해당 객체를 만들어서 반환해줍니다. 

 

안드로이드의 경우 대표적으로 Retrofit2 나 Glide 등의 라이브러리에서 사용됩니다. 이를 빌더 패턴을 안쓰고 했더라면 Retrofit 생성자 매개변수로 넣어줬어야 했을텐데 음... 빌더패턴의 필요성을 느낄 수 있습니다.

Retrofit.Builder()
            .baseUrl(ApiClient.BASE_URL)
            .client(get())
            .addConverterFactory(get<GsonConverterFactory>())
            .build()

 

일반 자바코드 예제는 밑 사이트에서 빠르게 읽기 쉽고 이해할 수 있습니다.

https://lemontia.tistory.com/483

 

[JAVA] 빌더 패턴(Builder Pattern)에 대해 알아보자

빌더 패턴은 디자인 패턴 중 하나로써 의도는 생성과 표현의 분리입니다. 그런데 이렇게만 쓰면 감이 잘 안올 수 있으니 실제 사례를 말해보겠습니다. 내 경우 map 에 담아서 데이터를 활용한 경�

lemontia.tistory.com

 

 

 


 

2. 어댑터 패턴 (Adapter Pattern)

[요약]

어댑터 패턴(Adapter pattern)은 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해줍니다.

 

핸드폰 충전기 어댑터 말 그대로 이해를 했습니다. 이미 잘 쓰고 있는 충전기(Client)와 콘센트(Adaptee)가 있는데 직접 연결을 하지 않고 어댑터(Adapter)를 통해 둘을 연결해줍니다. (두 호환성 없는 인터페이스를 이어주는 역할을 합니다.) 즉 충전기에서 바로 콘센트로 요청을 안보내고 어댑터를 통해 보내므로 충전기와 콘센트가 서로 안맞아도 어댑터만 수정하고 잘 만듬으로써 둘 을 같이 작동할 수 있게 해줍니다.

충전기와 콘센트가 안맞는다면 매번 둘 중 하나를 바꿔야하는 등 문제점이 많을텐데(하나를 고치면 다른거의 호환이 망가지고..) 어댑터 패턴을 사용함으로써 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용이 가능해지므로 관리하기가 쉬워집니다.  여러 관련된 시스템 모듈을 사용하는 경우 특히 효과적일 것 같습니다. 

 

P.S  저는 어댑터 패턴이 적용된걸 직접 본게 안드로이드에서 밖에 없어서  안드로이드 예시를 들고 왔습니다.

1) RecyclerView.Adapter클래스는 비지니스 로직(Model)과 RecyclerView를 연결하는 역할을 합니다.

2) RecyclerView.Adapter은 Movie 아이템에 접근하고 해당 데이터를  View에 세팅해줌으로써 그려줍니다. 

어댑터에 의해 Model(Movie) 과 View(Recyclerview) 는 서로에 대해 몰라도 연결 될 수 있습니다.

즉 어떤 아이템과 뷰든 연결해 줄 수 있습니다.

package com.mtjin.androidarchitecturestudy.ui

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.RatingBar
import android.widget.TextView
import androidx.core.text.HtmlCompat
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.mtjin.androidarchitecturestudy.R
import com.mtjin.androidarchitecturestudy.data.Movie

class MovieAdapter :
    RecyclerView.Adapter<MovieAdapter.ViewHolder>() {
    private lateinit var callback: (Movie) -> Unit
    private val items: ArrayList<Movie> = ArrayList()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view: View = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_movie, parent, false)
        val viewHolder = ViewHolder(view)
        view.setOnClickListener {
            callback(items[viewHolder.adapterPosition])
        }
        return viewHolder
    }

    override fun getItemCount(): Int = items.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        items[position].let {
            holder.bind(it)
        }
    }

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        private val ivPoster = itemView.findViewById<ImageView>(R.id.iv_poster)
        private val rvRating = itemView.findViewById<RatingBar>(R.id.rb_rating)
        private val tvTitle = itemView.findViewById<TextView>(R.id.tv_title)
        private val tvReleaseDate = itemView.findViewById<TextView>(R.id.tv_release_date)
        private val tvActor = itemView.findViewById<TextView>(R.id.tv_actor)
        private val tvDirector = itemView.findViewById<TextView>(R.id.tv_director)

        fun bind(movie: Movie) {
            with(movie) {
                Glide.with(itemView).load(image)
                    .placeholder(R.drawable.ic_default)
                    .into(ivPoster!!)
                rvRating.rating = (userRating.toFloatOrNull() ?: 0f) / 2
                tvTitle.text = HtmlCompat.fromHtml(title, HtmlCompat.FROM_HTML_MODE_COMPACT)
                tvReleaseDate.text = pubDate
                tvActor.text = actor
                tvDirector.text = director
            }
        }
    }

    fun add(items: List<Movie>) {
        this.items.addAll(items)
        notifyDataSetChanged()
    }

    fun setItemClickListener(callback: (Movie) -> Unit) {
        this.callback = callback
    }

    fun clear() {
        this.items.clear()
        notifyDataSetChanged()
    }
}

 

 

자세한 예제와 설명은 밑을 참고합니다.

 

여러 경우의 어댑터패턴 예시와 안드로이드 리사이클러뷰 어댑터 부분을 설명해주고 있습니다. 3번째 사이트에서는 추가로 클래스 어댑터와 객체 어댑터 두가지의 차이점에 대해서 설명합니다.

https://kimch3617.tistory.com/entry/%EC%96%B4%EB%8C%91%ED%84%B0-%ED%8C%A8%ED%84%B4-adapter-pattern

 

어댑터 패턴 - adapter pattern

어댑터 패턴의 어탭터는 일상 생활에서 플러그 인터페이스를 변환하는 역할과 똑같은 역할을 한다. 소프트웨어 시스템은 여러 모듈로 구성되고 여러 업체에서 제공한 인터페이스를 사용한다. �

kimch3617.tistory.com

http://sunphiz.me/wp/archives/1292

 

안드로이드의 어댑터(Adapter) – Dog발자

먼저 어댑터 패턴부터 살펴보자. 아래 그림이 보통 Adapter 패턴을 설명할 때 사용되는 인용되는 그림이다. http://obsoletedeveloper.wordpress.com/2012/09/14/adapter-pattern/ 위 그림을 간단히 설명하면 Client가 Ad

sunphiz.me

https://jusungpark.tistory.com/22

 

디자인패턴 - 어댑터 패턴 (adapter pattern)

어댑터 패턴 (adapter pattern) 한 클래스의 인터페이스를 클라이언트에서 사용하고자하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스�

jusungpark.tistory.com

 


 

3. 옵저버 패턴 (Observer Pattern)

[간단요약]

옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. 발행/구독 모델로 알려져 있기도 하다.

유튜브 처럼 방송인과 구독자 1 : N 관계에 있고 방송인이 방송을 올리면(이벤트 발행) 구독자들에게 알림이 가서 알 수 있다고 생각하면 쉽습니다. 이 알림을 위해 콜백이 필수로 사용되며 인터페이스가 필요합니다.

안드로이드에서는 클릭리스너, RxJava2, LiveData 등 많이 사용됩니다. 

 

https://ko.wikipedia.org/wiki/%EC%98%B5%EC%84%9C%EB%B2%84_%ED%8C%A8%ED%84%B4

 

옵서버 패턴 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체��

ko.wikipedia.org

 

 


4. 싱글턴 패턴 (Singleton Pattern)

코틀린에서는 Object로 구현이 가능하다.

 

소프트웨어 디자인 패턴에서 싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다. 주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.

 

https://velog.io/@kyle/%EC%9E%90%EB%B0%94-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4-Singleton-Pattern

 


 

 

5. 팩토리 메소드 패턴

팩토리 메서드 패턴(Factory method pattern)은 객체지향 디자인 패턴이다. Factory method는 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며. 자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다. 부모(상위) 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다.

 

 

실제 코드로 이해하기 쉬운 예제

https://jdm.kr/blog/180

 

팩토리 메소드 패턴(Factory Method Pattern) :: JDM's Blog

이번 포스팅은 팩토리 메소드 패턴Factory Method Pattern에 대해 알아보고자 합니다. Factory Method Pattern 기본적으로 팩토리는 공장이란 뜻을 내포하고 있습니다. 따라서 팩토리 메소드 패턴도 무언가��

jdm.kr

 

728x90
Comments