博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 设计模式:(四)工厂模式 —— 烘烤OO的精华
阅读量:6237 次
发布时间:2019-06-22

本文共 4331 字,大约阅读时间需要 14 分钟。

1.简单工厂(Simple Factory)部分
*针对接口编程可以隔离掉系统以后可能发生的一大堆改变。
*用静态方法定义的工厂被成为静态工厂,这样就不用使用创建对象的方法来实例化对象,使用方便。但是这样
做的缺点是无法通过继承来改变创建方法的行为。
*简单工厂不是一种设计模式,但是它比较常用。
2.工厂方法(Factory Method)模式部分
----芝加哥风味匹萨店----
public class ChicagoPizzaStore extends PizzaStore { Pizza createPizza(String item) { if ("cheese".equals(item)) { return ChicagoStyleCheesePizza(); } else if ("veggie".equals(item)) { return ChicagoStyleVeggiePizza(); } else if ("clam".equals(item)) { return ChicagoStyleClamPizza(); } else if ("pepperoni".equals(item)) { return ChicagoStylePepperoniPizza(); } else return null; } } ------------
----加州风味匹萨店----
public class CaliforniaPizzaStore extends PizzaStore { Pizza createPizza(String item) { if ("cheese".equals(item)) { return CaliforniaStyleCheesePizza(); } else if ("veggie".equals(item)) { return CaliforniaStyleVeggiePizza(); } else if ("clam".equals(item)) { return CaliforniaStyleClamPizza(); } else if ("pepperoni".equals(item)) { return CaliforniaStylePepperoniPizza(); } else return null; } }
------------
*工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样,客户程序中关于超类的代码就和子类对
象的创建代码解耦(Decouple)了。
工厂方法的定义:abstract Product factoryMethod(String type);
*所有工厂模式都用来封装对象的创建。
*工厂方法模式(Factory Method Pattern)通过让子类来决定该创建的对象是什么,来达到将对象的创建过程
封装的目的。
*在工厂方法模式中包括创建者(Creator)类和产品(Product)类两种类型的类。
工厂(Factory Method Pattern)方法模式:定义了一个创建对象的接口,但是由子类来决定要实例化的类是
哪一个。它让类把实例化推迟到了子类。
*创建者(Creator)类实现了所有操纵产品的方法,但是不实现工厂方法。
*工厂方法模式可以和策略(Strategy)模式结合起来,在运行时动态地更换工厂类,从而创建不同的产品对
象,这是简单工厂所不具有的弹性。
*工厂方法模式可以让客户在实例化对象时,只依赖接口,而不依赖具体的实现类。这符合“针对接口编程,而
不是针对实现编程”的软件设计原则。
*如果类A的改变会影响到类B,那么我们说类B“依赖于”类A。
软件设计原则:要依赖抽象,不要依赖具体类。这个原则又被称为“依赖倒置原则(Dependency Inversion
Principle)”。
*依赖倒置原则说明不能让高层组件依赖于底层组件,而且它们都应该依赖于抽象。
*遵循依赖倒置原则的三个指导方针:
(1)变量不可以持有具体类的引用。这可以通过使用工厂避开。
(2)不要让类派生自具体类。否则就会依赖具体类,违反了“针对接口编程,而不是针对现实编程”的软件设
计原则。
(3)不要覆盖基类中已实现的方法。出现这样的情况就说明基类设计的有问题。
3.抽象工厂(Abstract Factory)模式部分
抽象工厂模式:提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。
*抽象工厂模式是工厂方法模式的演变。工厂方法模式中,创建者只生产一种类型的产品,而抽象工厂模式中,
创建者生产一组不同类型的产品。
----ChicagoPizzaIngredientFactory代码----
public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory { public Dough createDough() { return new ThickCrustDough(); } public Sause createSause() { return new FlumTomatoSause(); } public Cheese createCheese() { return new Mozzarella(); } public Veggies[] createVeggies() { return new Beggies[] {new BlackOlives(), new Spinach(), new EggPlant()}; } public Pepperoni createPepperoni() { return new SlicedPepperoni(); } public Clam createClam() { return new FrozenClams(); } }
------------
*抽象工厂(Abstract Factory)模式同时结合了工厂方法(Factory Method)模式和策略(Strategy)模式。
*工厂方法使用继承:把对象的创建委托(Delegate)给子类,让子类实现工厂方法创建对象。
*抽象工厂使用对象的组合:对象的创建被实现在工厂接口所暴露出来的方法中。
*所有工厂模式都通过减少应用程序和具体类之间的依赖来促进松耦合,即解耦(Decouple)。
4.简单工厂(Simple Factory)实例
public abstract class Car { protected String name;// 名称 protected String engines;// 发动机 protected String wheels;// 车轮 protected String lamps;// 车灯 public void prepare() { System.out.println("Preparing " + name); System.out.println("Get engines ready..."); System.out.println("Get wheels ready..."); System.out.println("Get lamps ready..."); } // 组装 public void fabricate() { System.out.println("Adding engines."); System.out.println("Adding wheels."); System.out.println("Adding lamps."); } // 检测 public void detect() { System.out.println("Detect the car."); } public String getName() { return name; } } public class BmwX3Car extends Car { public BmwX3Car() { name = "BMW X3"; engines = "One Engine"; wheels = "Four Wheels"; lamps = "Two Lamps"; } } public class BmwX5Car extends Car { public BmwX5Car() { name = "BMW X5"; engines = "Two Engines"; wheels = "Four Wheels"; lamps = "Four Lamps"; } } public class BmwX7Car extends Car { public BmwX7Car() { name = "BMW X7"; engines = "Four Engine"; wheels = "Four Wheels and One Spare Tyre"; lamps = "Six Lamps"; } } public class SimpleCarFactory { // 简单工厂 public Car createCar(String type) { if ("bmwx3".equals(type)) { return new BmwX3Car(); } else if ("bmwx5".equals(type)) { return new BmwX5Car(); } else if ("bmwx7".equals(type)) { return new BmwX7Car(); } else return null; } } // 汽车销售店 public class CarSalesShop { public Car orderCar(String type) { SimpleCarFactory factory = new SimpleCarFactory(); Car car = factory.createCar(type); car.prepare(); car.fabricate(); car.detect(); System.out.println("A " + car.getName() + " car is ready."); return car; } }

转载地址:http://oszia.baihongyu.com/

你可能感兴趣的文章
WebGL实现HTML5贪吃蛇3D游戏
查看>>
webstorm配置eslint注意
查看>>
PHP加密与实际应用
查看>>
ikun 潜入?疑似 B 站后台源码泄露
查看>>
通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise
查看>>
斯坦福iOS_系列视频之俄罗斯方块
查看>>
JavaScript数据类型的一些注意要点
查看>>
结合P2P软件使用Ansible分发大文件
查看>>
特斯拉Model 3成为核心产品 生产线问题刚好又坏在运输环节 ...
查看>>
如何在Windows系统下的Eclipse中安装Cloud Toolkit
查看>>
阿里云服务器实例规格族配置怎么选?
查看>>
关于K8s集群器日志收集的总结
查看>>
Java中String和StringBuffer对于拼接运算中效率的对比 ...
查看>>
吉利自动驾驶之路将完成:到2022年推出L5级别亚运园区接驳车 ...
查看>>
阿里重磅开源首款自研科学计算引擎Mars,揭秘超大规模科学计算 ...
查看>>
java B2B2C 源码 多级分销Springcloud多租户电子商城系统-使用spring cloud Bus刷新配置...
查看>>
Ionic如何创建自定义展开标题组件
查看>>
用AI简化医疗重复性任务,这家美国创企这样做
查看>>
商用车诊修服务商“瑞修得”获1500万元Pre-A轮融资
查看>>
过滤器实栗 登录检测
查看>>