Modo construtor (modo construtor) -tipo de criação

Tipo de criação

1. Padrão de design singleton
2. Padrão de design de fábrica
3. Padrão de design de construtor
4. Padrão de design de protótipo

Tipo de estrutura

5. Padrão de design de agência
6, padrão de design de ponte
7, padrão de design de decoração
8, padrão de design de adaptador
9, padrão de design de aparência
10, padrão de design flyweight
11, padrão de design de combinação

Comportamental

12. Modo de design do modelo

Introdução:

Na linguagem de desenvolvimento orientada a objetos, o modo de construtor é igual ao modo de fábrica para criar objetos; a diferença é que o modo de fábrica é usado para criar diferentes tipos de objetos, mas relacionados (herdando a mesma classe pai ou um grupo de subclasses da interface). Os parâmetros fornecidos determinam qual tipo de objeto é criado. O modo builder é usado para criar um tipo de objeto complexo, definindo diferentes parâmetros opcionais, "customizados" para criar diferentes objetos.

Cenário de aplicação

Esses cenários serão aplicados ao modo construtor, principalmente para os seguintes requisitos:

1. Uma classe tem muitos atributos, que devem ser inicializados quando o objeto é criado. Se você usar o construtor para inicializar esses atributos, o construtor retornará muito longo, muitos parâmetros não são adequados para uso e é fácil cometer erros, mas não pode ser colocado no método definido. As propriedades garantidas devem ser inicializadas;

2. Se houver certas dependências ou restrições entre os atributos da classe, continuamos a usar o construtor com a ideia de design do método set (), então a lógica de verificação dessas dependências ou restrições não será mais colocada.

3. Se quisermos criar um objeto imutável, ou seja, após a criação do objeto, não podemos mais modificar o valor da propriedade interna.Para alcançar esta função, não podemos expor o método set () na classe. A maneira como o construtor coopera com o método set () para definir o valor do atributo não é aplicável.

Implementação do modo Builder

Dê uma olhada no AlertDialog no código-fonte do Android; você pode ver no AlertDialog que ele é implementado usando o modo criador;

Parte do código-fonte:

public class AlertDialog extends Dialog implements DialogInterface {
    private AlertController mAlert;

  
    
    protected AlertDialog(Context context) {
        this(context, 0);
    }

    protected AlertDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
        this(context, 0);

        setCancelable(cancelable);
        setOnCancelListener(cancelListener);
    }

    
    protected AlertDialog(Context context, @StyleRes int themeResId) {
        this(context, themeResId, true);
    }

    AlertDialog(Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) {
        super(context, createContextThemeWrapper ? resolveDialogTheme(context, themeResId) : 0, createContextThemeWrapper);

        mWindow.alwaysReadCloseOnTouchAttr();
        mAlert = AlertController.create(getContext(), this, getWindow());
    }

    @Override
    public void setTitle(CharSequence title) {
        super.setTitle(title);
        mAlert.setTitle(title);
    }

    public void setCustomTitle(View customTitleView) {
        mAlert.setCustomTitle(customTitleView);
    }

    public void setMessage(CharSequence message) {
        mAlert.setMessage(message);
    }

   
    public void setMessageMovementMethod(MovementMethod movementMethod) {
        mAlert.setMessageMovementMethod(movementMethod);
    }

    /** @hide */
    public void setMessageHyphenationFrequency(
            @Layout.HyphenationFrequency int hyphenationFrequency) {
        mAlert.setMessageHyphenationFrequency(hyphenationFrequency);
    }

    /**
     * Set the view to display in that dialog.
     */
    public void setView(View view) {
        mAlert.setView(view);
    }

    
    public void setView(View view, int viewSpacingLeft, int viewSpacingTop, int viewSpacingRight, int viewSpacingBottom) {
        mAlert.setView(view, viewSpacingLeft, viewSpacingTop, viewSpacingRight, viewSpacingBottom);
    }
    
    public void setIcon(@DrawableRes int resId) {
        mAlert.setIcon(resId);
    }

    public void setIcon(Drawable icon) {
        mAlert.setIcon(icon);
    }

    
    public void setIconAttribute(@AttrRes int attrId) {
        TypedValue out = new TypedValue();
        mContext.getTheme().resolveAttribute(attrId, out, true);
        mAlert.setIcon(out.resourceId);
    }

    public void setInverseBackgroundForced(boolean forceInverseBackground) {
        mAlert.setInverseBackgroundForced(forceInverseBackground);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAlert.installContent();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (mAlert.onKeyDown(keyCode, event)) return true;
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (mAlert.onKeyUp(keyCode, event)) return true;
        return super.onKeyUp(keyCode, event);
    }

    public static class Builder {
        private final AlertController.AlertParams P;

        public Builder(Context context) {
            this(context, resolveDialogTheme(context, ResourceId.ID_NULL));
        }

        
        public Builder(Context context, int themeResId) {
            P = new AlertController.AlertParams(new ContextThemeWrapper(
                    context, resolveDialogTheme(context, themeResId)));
        }

        
        public Context getContext() {
            return P.mContext;
        }

        public Builder setTitle(@StringRes int titleId) {
            P.mTitle = P.mContext.getText(titleId);
            return this;
        }

        
        public Builder setTitle(CharSequence title) {
            P.mTitle = title;
            return this;
        }

       
        public Builder setMessage(@StringRes int messageId) {
            P.mMessage = P.mContext.getText(messageId);
            return this;
        }

        
        public Builder setMessage(CharSequence message) {
            P.mMessage = message;
            return this;
        }

       
        public Builder setIcon(@DrawableRes int iconId) {
            P.mIconId = iconId;
            return this;
        }

       
        public Builder setIcon(Drawable icon) {
            P.mIcon = icon;
            return this;
        } 

        
        public Builder setOnKeyListener(OnKeyListener onKeyListener) {
            P.mOnKeyListener = onKeyListener;
            return this;
        }

       
        public Builder setItems(@ArrayRes int itemsId, final OnClickListener listener) {
            P.mItems = P.mContext.getResources().getTextArray(itemsId);
            P.mOnClickListener = listener;
            return this;
        }

        
        public Builder setItems(CharSequence[] items, final OnClickListener listener) {
            P.mItems = items;
            P.mOnClickListener = listener;
            return this;
        }

        
        public Builder setAdapter(final ListAdapter adapter, final OnClickListener listener) {
            P.mAdapter = adapter;
            P.mOnClickListener = listener;
            return this;
        }

        
        public Builder setCursor(final Cursor cursor, final OnClickListener listener,
                String labelColumn) {
            P.mCursor = cursor;
            P.mLabelColumn = labelColumn;
            P.mOnClickListener = listener;
            return this;
        }

       
        public Builder setMultiChoiceItems(@ArrayRes int itemsId, boolean[] checkedItems,
                final OnMultiChoiceClickListener listener) {
            P.mItems = P.mContext.getResources().getTextArray(itemsId);
            P.mOnCheckboxClickListener = listener;
            P.mCheckedItems = checkedItems;
            P.mIsMultiChoice = true;
            return this;
        }
       
        public Builder setSingleChoiceItems(@ArrayRes int itemsId, int checkedItem,
                final OnClickListener listener) {
            P.mItems = P.mContext.getResources().getTextArray(itemsId);
            P.mOnClickListener = listener;
            P.mCheckedItem = checkedItem;
            P.mIsSingleChoice = true;
            return this;
        }

        
        public Builder setSingleChoiceItems(Cursor cursor, int checkedItem, String labelColumn,
                final OnClickListener listener) {
            P.mCursor = cursor;
            P.mOnClickListener = listener;
            P.mCheckedItem = checkedItem;
            P.mLabelColumn = labelColumn;
            P.mIsSingleChoice = true;
            return this;
        }
        
        public Builder setView(int layoutResId) {
            P.mView = null;
            P.mViewLayoutResId = layoutResId;
            P.mViewSpacingSpecified = false;
            return this;
        }

        
        public Builder setView(View view) {
            P.mView = view;
            P.mViewLayoutResId = 0;
            P.mViewSpacingSpecified = false;
            return this;
        }

       
        @Deprecated
        public Builder setView(View view, int viewSpacingLeft, int viewSpacingTop,
                int viewSpacingRight, int viewSpacingBottom) {
            P.mView = view;
            P.mViewLayoutResId = 0;
            P.mViewSpacingSpecified = true;
            P.mViewSpacingLeft = viewSpacingLeft;
            P.mViewSpacingTop = viewSpacingTop;
            P.mViewSpacingRight = viewSpacingRight;
            P.mViewSpacingBottom = viewSpacingBottom;
            return this;
        }

       
        @Deprecated
        public Builder setInverseBackgroundForced(boolean useInverseBackground) {
            P.mForceInverseBackground = useInverseBackground;
            return this;
        }


        public AlertDialog create() {
            // Context has already been wrapped with the appropriate theme.
            final AlertDialog dialog = new AlertDialog(P.mContext, 0, false);
            P.apply(dialog.mAlert);
            dialog.setCancelable(P.mCancelable);
            if (P.mCancelable) {
                dialog.setCanceledOnTouchOutside(true);
            }
            dialog.setOnCancelListener(P.mOnCancelListener);
            dialog.setOnDismissListener(P.mOnDismissListener);
            if (P.mOnKeyListener != null) {
                dialog.setOnKeyListener(P.mOnKeyListener);
            }
            return dialog;
        }

        
        public AlertDialog show() {
            final AlertDialog dialog = create();
            dialog.show();
            return dialog;
        }
    }

}

Builder é a classe chave para criar objetos no modo builder. As variáveis ​​de membro do objeto construído são geralmente definidas repetidamente dentro. Ou seja: o modo builder é usado para construir o objeto. O código é na verdade um pouco repetitivo. As variáveis ​​de membro na classe AlertDialog (AlertController mAlert), deve ser redefinido na classe Builder (AlertController.AlertParams P contém a variável de membro mAlert). A variável de membro mAlert contida em P pode ser vista no código a seguir

//在Builer类的create方法中有如下代码
final AlertDialog dialog = new AlertDialog(P.mContext, 0, false);            

P.apply(dialog.mAlert);

O modo builder pode usar chamadas em cadeia para definir parâmetros e usar objetos builder, como:

 AlertDialog builder = new AlertDialog.Builder(this).setTitle("这是Title").setIcon(R.drawable.ic_launcher_background).setMessage("提示信息").create();
 builder.show();


//或者,builder的show()方法会先调用create()方法
AlertDialog builder = new AlertDialog.Builder(this).setTitle("这是Title").setIcon(R.drawable.ic_launcher_background).setMessage("提示信息").show();

Resumo: As três necessidades ou problemas de desenvolvimento acima podem ser resolvidos por meio do modelo do construtor;

Acho que você gosta

Origin blog.csdn.net/ezconn/article/details/106737936
Recomendado
Clasificación