건설자 모델 - 다섯 가지 창설형 모델 중 하나

4953 단어

1. 앞말


단일 예제 모드에서는 하나의 실례를 만들 수 있으며, 이 실례가 존재하는 경우 같은 실례를 다시 만들지 않습니다.그러나 뚜렷한 단점은 확장성이 높지 않다는 것이다.실제 개발에서 다른 창설 대상의 상황을 자주 만나 사용자의 수요에 따라 실례를 설정한다.만약에 구조 함수에 넣으면 판단 문장을 추가하거나 구조 함수를 다시 불러오기 때문에 매우 유연하지 않다.setter를 통해 주입하면 기능과 상관없는 많은 방법이 증가할 수 있고 대상의 설정은 일반적으로 초기화할 때 사용자가 수시로 수정할 수 없습니다.

2. 개념


건설자 모델은 복잡한 대상의 구축과 그 표현을 분리시켜 대상이 기능의 전시에 전념하고 내부의 실현을 숨긴다.주의해야 할 것은 일단 대상을 만들면 설정을 수정할 수 없다는 것이다.그리고 가장 오해받기 쉬운 두 번째 문장은 같은 구축 과정에서 서로 다른 표현을 만들 수 있다. 즉, 대상을 만드는 알고리즘은 그 조립 방식에 독립하고 생성 결과에 서로 다른 표현을 허용해야 한다.

3. 장면


식품 공장에서 월병을 생산할 준비를 하려면 시장의 취향에 따라 금형 한 세트를 만들어야 한다.그리고 금형을 통해 월병의 배아를 성형시키고 표면에 무늬를 찍는다.여기서 주의해야 할 것은 우리가 서로 다른 금형을 신축하여 식품 공장에서 서로 다른 월병을 생산할 수 있다는 것이다.

4. 쓰기

public final class Mooncakes {
    
    // 1. 
    private int mSize;
    private String mName;
    
    private Mooncakes(int size, String name) {
        super();
        mSize = size;
        mName = name;
    }

    // 2. 
    public void product() {
        System.out.println("   " + mSize + "   " + " " + mName + " ");
    }
    
    public static class Builder {

        // 3. 
        private int mSize = 10;
        private String mName = "";
        
        // 4. 
        public Builder setSize(int size) {
            if (size > 0) {
                mSize = size;
            }
            return this;
        }
        
        public Builder setName(String name) {
            if (name != null && !name.equals("")) {
                mName = name;
            }
            return this;
        }
        
        // 5. 
        public Mooncakes build() {
            return new Mooncakes(mSize, mName);
        }
        
    }

}
public class Company {

    public static void main(String[] args) {
        //  , 
        new Mooncakes.Builder().setSize(4).setName(" ").build().product();
        new Mooncakes.Builder().setName(" ").build().product();
        new Mooncakes.Builder().setSize(4).build().product();
    }

}

몰라, 모두가 발견한 문제가 있어.구체적인 금형은 월병과 연결되어 있지만 금형의 제작은 규범에 맞지 않고 비교적 자유롭고 실제에 부합되지 않는다.그래서 우리는 두 번째 개념에 주목해야 한다.여기에 잘못된 부분이 있습니다. 여러분은 해피히피의 글을 참고할 수 있습니다. 마지막 핵심 사상을 보면 충분합니다. 왜냐하면 우리가 토론하는 전제는 알고리즘이 변하지 않는다는 것입니다.Director는 Builder 구현 클래스에 의해 결정되는 몰드 제작 사양을 정의합니다.
// 1. 
public class Mooncakes {
    
    private int mSize;
    private String mName;
    
    public Mooncakes() {
        super();
        mSize = 10;
        mName = "";
    }
    
    public void setmSize(int mSize) {
        this.mSize = mSize;
    }
    public void setmName(String mName) {
        this.mName = mName;
    }

    @Override
    public String toString() {
        return "Mooncakes [mSize=" + mSize + ", mName=" + mName + "]";
    }

}
// 2. , 
public class Director {
    
    private Builder mBuilder;
    
    public Director(Builder builder) {
        super();
        mBuilder = builder;
    }

    //  , , 
    public Mooncakes produceMooncakes() {
        return mBuilder.setSize(4).setName(" ").build();
    }

}
// 3. 
public abstract class Builder {
    
    protected Mooncakes mCakes = new Mooncakes();
    
    public abstract Builder setSize(int size);
    
    public abstract Builder setName(String name);
    
    public Mooncakes build() {
        return mCakes;
    }

}
// 4. 
public class NormalBuilder extends Builder {

    @Override
    public Builder setSize(int size) {
        if (size > 0) {
            mCakes.setmSize(size);
        }
        return this;
    }

    @Override
    public Builder setName(String name) {
        if (name != null && !name.equals("")) {
            mCakes.setmName(name);
        }
        return this;
    }

}
// 5. 
public class LanceBuilder extends Builder {

    @Override
    public Builder setSize(int size) {
        if (size > 0) {
            mCakes.setmSize(size * 2);
        }
        return this;
    }

    @Override
    public Builder setName(String name) {
        if (name != null && !name.equals("")) {
            mCakes.setmName(" " + name);
        }
        return this;
    }

}
public class Company{

    public static void main(String[] args) {
        //  , 
        Mooncakes normalCakes = new Director(new NormalBuilder()).produceMooncakes();
        Mooncakes lanceCakes = new Director(new LanceBuilder()).produceMooncakes();
        System.out.println(normalCakes.toString());
        System.out.println(lanceCakes.toString());
    }

}

5. 요약


건설자 모델은 안드로이드 개발에서 흔히 볼 수 있는데 주로 시스템의 컨트롤을 호출하는데 예를 들어Dialog,Notification 등은 대량의 사용자 정의 설정을 해야 한다.체인식 호출을 통해 코드가 간결하고 알기 쉽기 때문에 봉인과 확장을 잘 결합시켰다.물론 결점도 뚜렷하고 종류가 많아졌다.

좋은 웹페이지 즐겨찾기