【设计模式】【十】工厂方法模式
来源:互联网 发布:windows计划任务设置 编辑:程序博客网 时间:2024/05/22 00:36
相关文章
【设计模式】【一】设计六大原则
【设计模式】【二】单例模式的七种写法
【设计模式】【三】建造者模式
【设计模式】【四】简单工厂模式
【设计模式】【五】观察者模式
【设计模式】【六】代理模式
【设计模式】【七】装饰模式
【设计模式】【八】外观模式
【设计模式】【九】模版方法模式
【设计模式】【十】工厂方法模式
【设计模式】【十一】策略模式
【设计模式】【十二】享元模式
【设计模式】【十三】抽象工厂模式
前言
在此前的【设计模式】【四】简单工厂模式中我们介绍了简单工厂模式,在这篇文章中我们来介绍下工厂方法模式,它同样是创建型设计模式,而且又有些类似,文章的末尾会介绍他们之间的不同。
1.工厂方法模式简介
工厂方法模式定义
定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
工厂方法模式UML图
找了下网上的UML图,都画的丑丑的,自己画吧,结果就出来这么一个更丑的UML图:
- Product:抽象产品类。
- ConcreteProduct:具体产品类,实现Product接口。
- Factory:抽象工厂类,该方法返回一个Product类型的对象。
- ConcreteFactory:具体工厂类,返回ConcreteProduct实例。
2.工厂方法模式简单实现
参考【设计模式】【四】简单工厂模式这篇文章,我接着举电脑生产的例子。
创建抽象产品
电脑产品类,它有一个start方法用于启动电脑:
public abstract class Computer{ public abstract void start();}
创建具体产品
具体的电脑产品分别是联想、惠普和华硕电脑:
public class LenovoComputer extends Computer { @Override public void start() { System.out.println("联想电脑启动"); }}
public class HpComputer extends Computer { @Override public void start() { System.out.println("惠普电脑启动"); }}
public class AsusComputer extends Computer{ @Override public void start() { System.out.println("华硕电脑启动"); }}
创建抽象工厂
里面有一个createComputer方法,想生产哪个品牌的电脑就生产那个:
public abstract class ComputerFactory { public abstract <T extends Computer> T createComputer(Class<T> clz);}
具体工厂
广达代工厂是一个具体的工厂,他继承抽象工厂,通过反射来生产不同厂家的电脑:
/** * 广达代工厂 */public class GDComputerFactor extends ComputerFactory { @Override public <T extends Computer> T createComputer(Class<T> clz) { Computer computer=null; String classname=clz.getName(); try { //通过反射来生产不同厂家的电脑 computer= (Computer) Class.forName(classname).newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T) computer; }}
客户端调用
public class Client { public static void main(String[]args) { ComputerFactory computerFactory = new GDComputerFactor(); LenovoComputer mLenovoComputer=computerFactory.createComputer(LenovoComputer.class); mLenovoComputer.start(); HpComputer mHpComputer=computerFactory.createComputer(HpComputer.class); mHpComputer.start(); AsusComputer mAsusComputerr=computerFactory.createComputer(AsusComputer.class); mAsusComputerr.start(); }}
结构很简单,看看下面的UML图就更加容易理解了:
3.工厂方法与简单工厂
简单工厂模式我们都知道,在工厂类中包含了必要的逻辑判断,根据不同的条件来动态实例化相关的类,对客户端来说,去除了与具体产品的依赖,与此同时也会带来一个问题:如果我们去增加产品,比如我们要生产苹果电脑,那我们就需要在工厂类中在添加一个Case分支条件,这违背了开放封闭原则,我们对修改也开放了,不理解开放封闭的原则的同学可以查看 【设计模式】【一】设计六大原则这篇文章。而工厂方法模式就没有违背这个开放封闭原则,如果我们需要生产苹果电脑,并不需要去修改工厂类,直接创建产品就好了。
- 设计模式(十)工厂方法模式
- 设计模式(十)工厂方法模式
- 【设计模式】【十】工厂方法模式
- 设计模式--工厂方法
- 工厂方法设计模式
- 设计模式-工厂方法
- 【设计模式】【工厂方法】
- 设计模式 - 工厂方法
- 工厂方法设计模式
- 工厂方法设计模式
- 【设计模式】工厂方法
- 设计模式--工厂方法
- 设计模式---工厂方法
- 设计模式-工厂方法
- 工厂方法设计模式
- 工厂方法设计模式
- 设计模式-工厂方法
- 设计模式 工厂方法
- 3dmax切割平行线
- python pdb 调试
- 依赖注入
- 开通支付宝口碑收款码提现免手续费,信用卡转账秒到支付宝
- mysql事务-隔离级别
- 【设计模式】【十】工厂方法模式
- 欢迎访问zjunzhao的博客
- poj2828 Buy Tickets
- AndroidStudio 运行Pepper Emulator
- 数组 字典转Json
- 2016年Web前端面试题目汇总
- avalonjs 实现简单购物车
- java 相关名词解释
- android MessageQueue 源码解析