设计模式篇-工厂模式与代理模式的混用(Factory+proxy pattern )

来源:互联网 发布:淘宝陈枝记真假 编辑:程序博客网 时间:2024/05/16 16:10

设计模式篇-工厂模式与代理模式的混用(Factory+proxy pattern )

本篇博客将介绍一个 工厂模式+ 代理模式 一起混合使用的 demo 此demo的需求
是一个弹弹球工厂, 产品 弹弹球 有 不同的颜色需求 工厂要满足 这些 需求
弹弹球 还有 单个创造 和 多个创造 下面我们来看代码实现吧


首先我们先做个球

** * Created by hao on 2016/3/12. * 弹弹球 */public class BouncyBallView extends View {    private  Paint paint;    private Context context;    public int getBouncyBallColor() {        return bouncyBallColor;    }    public void setBouncyBallColor(int bouncyBallColor) {        this.bouncyBallColor = bouncyBallColor;        invalidate();    }    private int bouncyBallColor = Color.RED;    public BouncyBallView(Context context) {        super(context);    }    public BouncyBallView(Context context, AttributeSet attrs) {        super(context, attrs);        this.context = context ;        this.paint = new Paint();        this.paint.setAntiAlias(true);       // this.paint.setStyle(Paint.Style.FILL);    }    public BouncyBallView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        int center = getWidth()/2;        int innerCircle = dip2px(context,83);        int ringWidth = dip2px(context,5);        //绘制内圆        this.paint.setColor(bouncyBallColor);        canvas.drawCircle(center,center, center, this.paint);        Log.e("TAA","ondrow重绘");    }    /**     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)     */    public static int dip2px(Context context, float dpValue) {        final float scale = context.getResources().getDisplayMetrics().density;        return (int) (dpValue * scale + 0.5f);    }}

产品类

先抽象出产品的基本功能
在区别子类再去实现不同的功能

/** * Created by hao on 2016/3/12. * 产品类 */public interface BouncyBall {    public void createBouncyBall(ViewGroup view);}/** * 黑色的球 */class BlackBouncyBall implements  BouncyBall{    @Override    public void createBouncyBall(ViewGroup view) {        View inflat =  View.inflate(view.getContext(),R.layout.layout_bouncyball,null);        ((BouncyBallView)inflat.findViewById(R.id.bouncyball)).setBouncyBallColor(Color.BLACK);        view.addView(inflat);    }}/** * 蓝色的球 */class BlueBouncyBall implements  BouncyBall{    @Override    public void createBouncyBall(ViewGroup view) {       View inflat =  View.inflate(view.getContext(),R.layout.layout_bouncyball,null);        ((BouncyBallView)inflat.findViewById(R.id.bouncyball)).setBouncyBallColor(Color.BLUE);      view.addView(inflat);    }}

工厂类

抽象出工厂的功能
返回产品的抽象类
区别出不同产品的工厂 方便以后扩展

public interface FactoryBouncyBall  {    BouncyBall getCreateBouncyBall();}class FactoryBlackBouncyBall implements  FactoryBouncyBall{    @Override    public BouncyBall getCreateBouncyBall() {        return new BlackBouncyBall();    }}class FactoryBlueBouncyBall implements  FactoryBouncyBall{    @Override    public BouncyBall getCreateBouncyBall() {        return new BlueBouncyBall();    }}

代理者

代理处理工厂
控制器只需要调用代理者的方法即可
代理者里面 有创建 单个球 和 多个球的方法

/** * Created by hao on 2016/3/12. * 弹弹球制造工厂的代理人 */public class BounctBallProxy {    public final static int BLACK_BOUNCTBALL = 1;    public final static int BLUE_BOUNCTBALL = 2;    public BounctBallProxy(ViewGroup viewGroup) {    }    /**     * 如果要对每个球进行修改 还可以添加 tag     *     * @param viewGroup     * @param bounctballKine     */    public static void createoBounctBall(ViewGroup viewGroup, int bounctballKine) {        BouncyBall start = null;        switch (bounctballKine) {            case BLACK_BOUNCTBALL:                start = new FactoryBlackBouncyBall().getCreateBouncyBall();                Log.e("TAA", "createoBounctBall--------BLACK");                break;            case BLUE_BOUNCTBALL:                start = new FactoryBlueBouncyBall().getCreateBouncyBall();                Log.e("TAA", "createoBounctBall--------BLUE");                break;        }        if (start != null) {            start.createBouncyBall(viewGroup);            Log.e("TAA", "createoBounctBall--------start-------");        }    }    /**     * 如果要对每个球进行修改 还可以添加 tag     * 创建多个     *     * @param viewGroup     * @param bounctballKine     */    public static void createoBounctBall(ViewGroup viewGroup, int bounctballKine, int num) {        for (int x = 0; x < num; x++) {            createoBounctBall(viewGroup, bounctballKine);        }    }}

调用

/** * 一个完整的弹弹球工厂 */public class Main2Activity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main2);//        ViewGroup group = (ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content);        ViewGroup group = (ViewGroup) findViewById(R.id.main_id);        BounctBallProxy.createoBounctBall(group,BounctBallProxy.BLUE_BOUNCTBALL,10);    //    Log.e("TAA","Main2Activity--------");    }}

代码地址
供一起学习的小伙伴
https://github.com/mywanghao/twentythreemodule.git

欢迎大家提意见和补充

本篇博客结束
如果觉得对你有帮助

粉我把
关注更多我的blog.

技术交流群:

博客圈 493554215

这是一个热爱分享技术,拥有热烈学习氛围的群 ,
博主身为群内的一员感到骄傲
推荐还在路上的伙伴们

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 老师发打12分的试卷给家长怎么办 孩子在学校顶撞老师不让上学怎么办 被老师骂了不敢去学校怎么办 孩子不爱去幼儿园 总是哭怎么办呢 孩子在幼儿园被老师罚家长该怎么办 孩子不喜欢幼儿园里的体能课怎么办 初中叛逆期的孩子怎么办老师做法 二年级孩子不受老师待见怎么办 孩子该上初中了没学籍怎么办 四个多月的婴儿不喜欢看人怎么办 2个月婴儿不喜欢吃奶粉怎么办 想学习但是又学不进去怎么办 在省外读书 回来读高中学籍怎么办 一岁宝宝这几天不爱吃饭怎么办 2岁的宝宝吃多了怎么办 小孩吃了退烧药吐了怎么办 牙齿与牙齿之间有洞喜欢塞牙怎么办 胃有点烧心天天没食欲不饿怎么办 1岁半宝宝不吃饭光喝奶粉怎么办 一岁半宝宝光喝奶粉不吃饭怎么办 一岁半的宝宝光喝奶粉不吃饭怎么办 两岁半宝宝光喝奶粉不吃饭怎么办 宝宝9个月不好好吃饭奶粉怎么办 2岁半宝宝不愿意自己吃饭怎么办 一周岁多的宝宝不吃饭怎么办 一岁宝宝吃母乳不爱吃饭怎么办 三个月大的宝宝不肯喝奶粉怎么办 自己要上班婆婆带孩子看不惯怎么办 让农村婆婆来给我带孩子怎么办 吃的不好胃难受怎么办吃什么药 特别讨厌婆婆还需要她带小孩怎么办 一岁八个月宝宝不喜欢穿袜子怎么办 未来婆婆给我买衣服我不喜欢怎么办 孩子调皮被同学排斥不想上学怎么办 宝宝出生没人带怎么办自己要上班 孩子上幼儿园一年了还哭怎么办 6年级孩子会认字不会写怎么办 小孩写字没兴趣爱玩玩具怎么办 小学二年级语文记不住生字怎么办 2周半宝宝不肯马桶拉臭臭怎么办 娃晚上不肯睡早上不肯起怎么办