工厂方法
来源:互联网 发布:vb和vba语法 编辑:程序博客网 时间:2024/06/06 02:22
简单工厂违背了开闭原则,每次新增产品类都会修改工厂类,为了改正上述问题,出现了工厂方法。
工厂方法模式把创建具体类交给具体的工厂类去完成。类图如下:
代码:
抽象产品类Product:
/** * 产品类的抽象类 */public abstract class Product { public abstract void method();}
具体产品类A、B:
public class ConcreateProductA extends Product{ @Override public void method() { System.out.println("我是具体的产品A"); }}public class ConcreateProductB extends Product{ @Override public void method() { System.out.println("我是具体的产品B"); }}
抽象工厂类:
/** * 抽象工厂类 * 生产什么由子类去实现 */public abstract class Factory { //返回具体的产品底箱 public abstract Product createProduct();}
具体工厂类:
/** * 工厂类A创建产品A */public class ConcreateAFactory extends Factory { @Override public Product createProduct() { return new ConcreateProductA(); }}/** * 工厂类B创建产品B */public class ConcreateBFactory extends Factory { @Override public Product createProduct() { return new ConcreateProductB(); }}
当客户需要具体的产品时,由具体的工厂类创建。
上述方案也有不好的地方:当产品类增多时具体工厂类会增多
改进措施:使用反射,在工厂方法的参数中传入一个Class类来决定是哪一个产品类
抽象工厂类:
public abstract class Factory{ /** * 抽象工厂方法 * 具体生产什么由子类去实现 * * @param clz 产品对象类型 * @return 具体的产品对象 */ public abstract <T extends Product> T createProduct(Class<T> clz);}
具体工厂类:
public class ConcreteFactory extends Factory{ public <T extends Product> T createProduct(Class<T> clz) { Product product = null; try{ product = (Product)Class.forName(clz.getName()).newInstance(); }catch (Exception e) { e.printStackTrace(); } return (T) product; }}
客户端实现:
public class Client { public static void main(String[] args){ Factory factory = new ConcreteFactory(); Product product = factory.createProduct(ConcreateProductA.class); product.method(); }}
阅读全文
0 0
- 工厂与工厂方法
- 工厂模式 -- 工厂方法
- 工厂模式-工厂方法
- 抽象工厂 工厂方法
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 简单工厂,工厂方法
- 工厂方法
- 工厂方法
- 工厂方法
- 工厂方法
- 工厂方法
- 工厂方法
- 工厂方法
- 工厂方法
- 工厂方法
- 工厂方法
- 工厂方法
- 知名网站的 404 页面长啥样?
- 主流浏览器内核介绍(前端开发值得了解的浏览器内核历史)
- FB 妥协了,下周把 React 协议改成 MIT
- Web 的现状:网页性能提升指南
- 基于Android-Ultra-Pull-To-Refresh封装的轻量级上拉下拉刷新框架
- 工厂方法
- JAVA-封装
- React 16 如期发布,遵循 MIT 许可,你们还会继续用么?
- 2017 年 9 月:15 个有趣的 JS 和 CSS 库
- 趣图:大家帮我比较一下这些前端 offer
- 安息吧,REST API,GraphQL 长存
- 爱学习的程序员都关注了这些
- Angular 5 将会推迟发布,因升级过程的问题
- 深入 JavaScript 数组:进化与性能