Java设计模式之创建型模式-工厂模式(Factory)
来源:互联网 发布:java中new的用法 编辑:程序博客网 时间:2024/05/16 12:50
工厂模式又叫多态性工厂模式。在讲工厂模式之前,先简单讲下工厂模式的一个特殊实现–简单工厂模式,也叫做静态工厂方法模式,其不属于23种GOF设计模式之一。
简单工厂模式:一个工厂方法,依据传入的不同参数,生成对应的具体实例化对象。
简单工厂模式的实现
我这里以选择手机打电话为例。
1.创建一个Phone接口(抽象类/普通java类)
public interface Phone { void call();}
2.创建实现接口的两个实体类IPhone、MiPhone
public class IPhone implements Phone { public void call() { System.out.println("IPhone call..."); }}
public class MiPhone implements Phone { public void call() { System.out.println("MiPhone call..."); }}
3.创建一个工厂类,依据传入的参数,生成对应的实体类对象
public class PhoneFactory { public static Phone getPhone(String type) { if ("iphone".equalsIgnoreCase(type)) { return new IPhone(); } else if ("miphone".equalsIgnoreCase(type)) { return new MiPhone(); } return null; }}
4.工厂测试类
public class FactoryTest { public static void main(String[] args) { Phone phone = PhoneFactory.getPhone("iphone"); if (phone != null) { phone.call(); } else { System.out.println("无此手机类型..."); } }}
输出的结果:IPhone call...
通过上述实例,我们可以看到:
1.客户端不用去关心实体类对象创建的具体过程,达到了解耦的效果
2.工厂类可以根绝客户端输入的条件动态的去实例化对应的类
上述模式的程序还是可扩展的,比如我们要使用华为手机打电话,怎么做?
我们只需要创建一个新的实体类HuaweiPhone,同时实现IPhone这个接口,然后再在工厂类当中增加一个关于创建HuaweiPhone实例的判断分支。
else if ("huaweiphone".equalsIgnoreCase(type)) { return new HuaweiPhone();}
那么问题来了,增加如上的判断分支修改了我们原有的工厂类。换句话说,我们不仅对扩展开放了,而且对修改也开放了,这就有违设计模式六大原则中的开闭原则。
那么,怎么解决这个问题?这就要来看看工厂方法模式了。
工厂方法模式:定义一个用于创建对象的接口,让子类来决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
工厂模式的实现
我这里还是以上述例子为例。
1.创建一个Phone接口(抽象类/普通java类)
public interface Phone { void call();}
2.创建实现接口的两个实体类IPhone、MiPhone
public class IPhone implements Phone { public void call() { System.out.println("IPhone call..."); }}
public class MiPhone implements Phone { public void call() { System.out.println("MiPhone call..."); }}
3.创建一个抽象工厂接口
public interface PhoneFactory { Phone getPhone();}
4.创建对应实体类的工厂类,并实现抽象工厂接口
public class IPhoneFactory implements PhoneFactory { public Phone getPhone() { return new IPhone(); }}
public class MiPhoneFactory implements PhoneFactory { public Phone getPhone() { return new MiPhone(); }}
5.工厂测试类
public class FactoryTest { public static void main(String[] args) { PhoneFactory pf = new IPhoneFactory(); Phone p = pf.getPhone(); p.call(); }}
输出的结果:IPhone call...
通过工厂模式的实例可以发现,当需要新增加产品时,我们只需要增加一个对应的实体类和对应创建实体类的工厂。比如上述增加华为手机的例子,我们只需创建一个新的实体类HuaweiPhone实现IPhone接口,再新建一个新的工厂类HuaweiPhoneFactory实现PhoneFactory接口即可。而不用再对原本的工厂类进行修改,很好的符合开闭原则。
注:关于两者的使用情况
简单工厂模式:
工厂类负责创建的对象比较少
客户端只关心传入的参数,不关心内部具体实现
工厂模式:
需要大量创建不同的对象,且这些对象的实体类具有共同接口
- Java设计模式之创建型模式-工厂模式(Factory)
- Java设计模式之创建型模式-抽象工厂模式(Abstract Factory)
- 设计模式:创建型模式:工厂模式(factory pattern)
- JAVA设计模式(01):创建型-工厂模式【简单工厂模式】(Simple Factory)
- JAVA设计模式(01):创建型-工厂模式【简单工厂模式】(Simple Factory)
- JAVA设计模式(01):创建型-工厂模式【简单工厂模式】(Simple Factory)
- JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)
- JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)
- JAVA设计模式(24):创建型-工厂模式【工厂方法模式】(Factory Method)
- JAVA设计模式(01_1):创建型-工厂模式【工厂方法模式】(Factory Method)
- java设计模式之工厂模式(Factory)
- java设计模式之工厂模式(Factory)
- java设计模式之工厂模式Factory
- 设计模式-创建型模式之 Abstract Factory(抽象工厂)
- 设计模式-创建型模式之 Factory Method(工厂方法)
- 创建型设计模式之抽象工厂(Abstract Factory)模式
- 【设计模式】创建型模式之抽象工厂Abstract Factory
- 【设计模式】创建型模式之工厂方法Factory Method
- 加入收款二维码、郑重声明、去掉强制参数scope、强制参数优先级高于筛选参数
- 2017年7月20日01:23:23
- 弥漫之夜
- Android下载服务案例
- Python 学习日知录(八)- 迭代器初步
- Java设计模式之创建型模式-工厂模式(Factory)
- windows下的makefile
- android Java多线程的使用解析
- 笨方法学python(本文为阅读时从此书摘录的笔记) 第五天
- java 中一个char到底是多长
- 树状数组
- 北大方正是如何“变质”的?
- 数字在排序数组中出现的次数(剑指offer面试题56)
- windows或linux安装python