设计模式篇-工厂模式与代理模式的混用(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
- 设计模式篇-工厂模式与代理模式的混用(Factory+proxy pattern )
- 工厂设计模式(Factory Pattern)
- 设计模式-工厂模式(Factory Pattern)
- c++设计模式:工厂模式(Factory Pattern)
- 设计模式学习--工厂模式(Factory Pattern)
- 设计模式学习--工厂模式(Factory Pattern)
- 设计模式 - 工厂模式(factory pattern) 详解
- 设计模式学习--工厂模式(Factory Pattern)
- 设计模式:工厂模式(Factory Pattern)
- 设计模式【工厂模式Factory Pattern】
- 【设计模式】工厂模式(Factory Pattern)
- 设计模式 - Proxy Pattern(代理模式)
- 设计模式[8] Proxy Pattern 代理模式
- 设计模式 - Proxy Pattern(代理模式)
- 设计模式-代理模式(Proxy Pattern)
- 设计模式-代理模式(Proxy Pattern)
- 设计模式-代理模式(Proxy Pattern)
- 设计模式 -- 代理模式(Proxy Pattern)
- ubuntu通过bochs调好grub2
- Lambda架构与推荐在电商网站实践
- java正则表达式用法
- 面向对象的程序设计(理解对象)
- genymotion(带virtualbox)安装使用心得(1),必须记下来!!!
- 设计模式篇-工厂模式与代理模式的混用(Factory+proxy pattern )
- java线程池ThreadPoolExecutor的使用
- android 圆角图片
- Haar
- ubuntu下pdo mysql的安装
- Swift - Delegate
- 将android手机屏幕投影到电脑端
- Android布局文件.xml中的自定义属性
- 编程小练习6