美文网首页
23种设计模式-工厂模式

23种设计模式-工厂模式

作者: 王灵 | 来源:发表于2019-03-02 22:12 被阅读0次

    作用:生产具有相同特征的对象。使用类与工厂类交互以获得不同的具体产品类对象。

    关键元素:抽象产品类、具体产品类、抽象工厂类和具体工厂类。

    使用:
    创建复杂对象
    1、在MVVM模式中需要创建ViewModel对象,ViewModelProvider里就有一个工厂用于创建viewModel

    public interface Factory {
            /**
             * Creates a new instance of the given {@code Class}.
             * <p>
             *
             * @param modelClass a {@code Class} whose instance is requested
             * @param <T>        The type parameter for the ViewModel.
             * @return a newly created ViewModel
             */
            @NonNull
            <T extends ViewModel> T create(@NonNull Class<T> modelClass);
        }
    

    2、RecycleView,在使用列表时有时会需要多种不同样式的itemView(我都是使用组合控件实现的)。
    baseItemView.class(抽象产品类)

    public abstract class BaseItemView<T extends Object> extends FrameLayout {
        protected Context mContext;
        public BaseItemView(Context context) {
            super(context);
        }
    
        public BaseItemView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        public BaseItemView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            mContext=context;
            init();
        }
    
    
        protected void setContentView(int id) {
            LayoutInflater.from(mContext).inflate(id, this);
        }
    
        protected <T extends View> T getView(int resId) {
            return (T) findViewById(resId);
        }
    
        public abstract void init();
    
        public abstract void setData(T data);
    

    XXXItemView.class(具体产品类)

    public class AItemVIew extends BaseItemView<String> {
    
        public AItemVIew(@NonNull Context context) {
            super(context);
        }
    
        @Override
        public void init() {
            setContentView(R.layout.xxx);
            //view绑定及初始化设置
        }
    
        @Override
        public void setData(String data) {
    
        }
    
    
    }
    

    ItemViewFactory.class(抽象工厂)

    public abstract class ItemViewFactory {
        public abstract <T extends BaseItemView> T createItemView(Context context, Class<T> clz);
    }
    

    RecycleItemViewFactory.class(具体工厂)

    public class RecycleItemViewFactory extends ItemViewFactory {
        private BaseItemView itemView;
    
        @Override
        public <T extends BaseItemView> T createItemView(Context context, Class<T> clz) {
    
            try {
                //根据类名获取class对象
                Class c = Class.forName(clz.getName());
    
                //根据参数类型获得相应的构造函数
                Constructor constructor = c.getConstructor(Context.class);
                return (T) constructor.newInstance(context);
    
            } catch (Exception e) {
            }
            return null;
        }
    }
    
    

    如上我们可以使用mRecycleItemViewFactory.createItemView(Context context, Class<T> clz)获得对应的itemView,然后itemView.setData(Object object)设置数据。

    相关文章

      网友评论

          本文标题:23种设计模式-工厂模式

          本文链接:https://www.haomeiwen.com/subject/cnxuuqtx.html