AI智能
改变未来

GOF23之工厂模式详解


介绍

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。该模式满足了开闭原则,依赖倒转原则,迪米勒法则,实现了实现创建者和调用者分离。

1、简单工厂模式

1)、介绍

简单工厂模式是创建型模式,是工厂模式中的一种。该模式是由一个工厂对象决定创建出那种产品类的实例,该模式是工厂模式的最简单实现。

2)、使用方式

定义一个 创建对象的类,由该类来封装实例化对象的行为。
步骤
(1)、创建对象接口
(2)、创建接口实现类
(3)、创建一个工厂,生成基于给定信息的实体类的对象。
(4)、使用该工厂,通过传递类型信息来获取实体类的对象。
(5)、测试

3、结构图


实现

4)、优缺点

优点
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

5)、实现代码

package factory.simple;public interface Car {void name();}
package factory.simple;public class BaomaCar implements Car {@Overridepublic void name() {System.out.println(\"宝马Q6!\");}}
package factory.simple;public class WulingCar implements Car {@Overridepublic void name() {System.out.println(\"五菱宏光!\");}}
package factory.simple;//静态工厂public class Factory {public static Car getCar(String car){if (car.equals(\"五菱\")){return new WulingCar();}else if (car.equals(\"宝马\")){return new BaomaCar();}else {return null;}}}
package factory.simple;public class Consumer {public static void main(String[] args) {Car car = Factory.getCar(\"五菱\");Car car1 = Factory.getCar(\"宝马\");car.name();car1.name();}}

2、工厂方法模式

由于上面的简单工厂方法的不足,每增加一个实现类就必须修改工厂,不满足开闭原则。因此工厂方法模式对此进行了优化。

1)、优化

将每一个实例都增加一个独立的工厂来实现工厂接口,让各个工厂之间互不干扰。

具体实现

2)、代码

基本与上面一致,多了两个具体工厂

package factory.factorymothod;public class WulingFactory implements CarFactory {@Overridepublic Car getCar() {return new WulingCar();}}
package factory.factorymothod;public class BaomaFactory implements CarFactory {@Overridepublic Car getCar() {return new BaomaCar();}}

3、抽象工厂模式

1)、介绍

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

2)、使用场景

强调一系列相关产品对象一起使用创建对象需要大量的重复代码。

3)、使用流程

(1)定义具体的工厂
(2)定义抽象工厂将具体工厂收纳进去抽象工厂,
(3)实现具体工厂
(4)实现抽象工厂
(5)测试用例

4)、优缺点

优点:
(1)、具体产品在应用层的代码隔离,无需关心创建细节
(2)、将一个系列的产品统一到一起创建
缺点:
(1)、规定了所有可能被创建的产品集合,产品族中扩展新产品困难
(2)、增加了系统的抽象性和理解难度

5)、结构

具体用例实现

6)、代码

package factory.abstractfactory;//具体产品工厂:路由器public interface IRouterPrudct {void connectWifi();}
package factory.abstractfactory;//具体产品工厂:手机public interface IPhonePruduct {void call();void sendSms();}
package factory.abstractfactory;//抽象工厂:包含具体工厂public interface ProductFactory {IPhonePruduct iphonProduct();IRouterPrudct iRouterProduct();}
package factory.abstractfactory;//具体工厂实现public class XiaomiRouter implements IRouterPrudct {@Overridepublic void connectWifi() {System.out.println(\"小米路由器连接WiFi\");}}
package factory.abstractfactory;//具体工厂实现public class XiaomiPhone implements IPhonePruduct {@Overridepublic void call() {System.out.println(\"小米手机打电话\");}@Overridepublic void sendSms() {System.out.println(\"小米手机发信息\");}}
package factory.abstractfactory;//具体工厂实现public class HuaWeiIPhone implements IPhonePruduct {@Overridepublic void call() {System.out.println(\"华为手机打电话\");}@Overridepublic void sendSms() {System.out.println(\"华为手机发信息\");}}
package factory.abstractfactory;//具体工厂实现public class HuaWeiRouter implements IRouterPrudct {@Overridepublic void connectWifi() {System.out.println(\"华为路由器连接WiFi\");}}
package factory.abstractfactory;//抽象工厂实现public class HuaWeiFactory implements ProductFactory {@Overridepublic IPhonePruduct iphonProduct() {return new HuaWeiIPhone();}@Overridepublic IRouterPrudct iRouterProduct() {return new HuaWeiRouter();}}
package factory.abstractfactory;//抽象工厂实现public class XiaomiFactory implements ProductFactory {@Overridepublic IPhonePruduct iphonProduct() {return new XiaomiPhone();}@Overridepublic IRouterPrudct iRouterProduct() {return new XiaomiRouter();}}

4、总结

简单工厂模式:虽然不符合开闭原则,但是实际使用最多
工厂方法模式:在不修改已有类的前提下,增加了业务,符合开闭原则。
抽象工厂:在多变动业务的情况下使用会很麻烦。
应用场景:
JDK中的Calendar的getInstance方法
JDBC中的Connection对象获取
Spring的IOC容器创建管理Bean对象
反射中的Class对象的NewInstance方法

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » GOF23之工厂模式详解