一、工厂模式的特点
工厂模式核心是封装对象的创建接口,将new对象的操作封装起来,方便创建使用、管理对象。
工厂模式实现了解耦、降低代码重复、减少错误的作用。
解耦:把对象的创建和使用的过程分开。就是Class A 想调用Class B,那么只是调用B的方法,而至于B的实例化,就交给工厂类。
降低代码重复:如果创建B过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。
可以把这些创建对象B的代码放到工厂里统一管理。既减少了重复代码,也方便以后对B的维护。
减少错误:因为工厂管理了对象的创建逻辑,使用者不需要知道具体的创建过程,只管使用即可,
减少了使用者因为创建逻辑导致的错误。
二、工厂模式分类
工厂模式大体分为简单工厂、工厂方法、抽象工厂等三种模式。
简单工厂:由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(继承自一个父类或接口)的实例。
优点:将创建使用工作分开,不必关心类对象如何创建,实现了解耦;
缺点:违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
工厂方法:定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象
优点:符合开-闭原则:新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可;
符合单一职责原则:每个具体工厂类只负责创建对应的产品
缺点:增加了系统的复杂度:类的个数将成对增加;
增加了系统的抽象性和理解难度;一个具体工厂只能创建一种具体产品
抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。
优点:降低耦合;符合开-闭原则;符合单一职责原则;不使用静态工厂方法,可以形成基于继承的等级结构。
缺点:难以扩展新种类产品
三、工厂模式的一些适用场景:
1.对象的创建过程/实例化准备工作很复杂,需要很多初始化参数,查询数据库等
2.类本身有好多子类,这些类的创建过程在业务中容易发生改变,或者对类的调用容易发生改变
四、案例分析
以工厂方法进行代码设计
工厂方法模式由四个角色类组成:
抽象工厂类:定义工厂类的方法,用来创建产品类
具体工厂类:用于创建对应的产品对象
抽象产品类:定义产品了公共的属性、方法
具体产品类:实现对应产品类的属性、方法
它们之间的UML关系图如下:
定义产品类对象:
/** * 定义一个电脑的实体 * @author 13761 */ abstract class Computer { /** * 定义电脑的特性,都能用来打游戏 */ public abstract void play(); } class Desktop extends Computer{ private String name = ""; public Desktop(String name){ this.name = name; } @Override public void play() { System.out.println("使用 "+ name+" 畅玩3A大作"); } } class Laptop extends Computer{ private String name = ""; public Laptop(String name){ this.name = name; } @Override public void play() { System.out.println("使用 "+ name+" 享受4399小游戏"); } }
定义工厂类:
/** * 定义抽象工厂类,来定义所有工厂应该具备的职责,通性。 * @author 13761 * */ abstract class ComputerFactory { public abstract Computer createComputer(); } class DesktopFactory extends ComputerFactory{ @Override public Computer createComputer() { return new Desktop("台式电脑"); } } class LaptopFactory extends ComputerFactory{ @Override public Computer createComputer() { return new Laptop("笔记本电脑"); } }
定义测试类:
/** * 测试 * @author 13761 */ public class MethodFactoryClient { /** * 工厂方法模式,根据需要,直接创建对象。方便扩展。无用改变Factory类代码,只需要新增。 * @param args */ public static void main(String[] args) { DesktopFactory desktopFactory = new DesktopFactory(); Computer desktop = desktopFactory.createComputer(); desktop.play(); LaptopFactory laptopFactory = new LaptopFactory(); Computer laptop = laptopFactory.createComputer(); laptop.play(); } }
输出结果:
代码链接:https://github.com/13761174936/code/tree/master/src
原文:https://www.cnblogs.com/baozhw/p/12005225.html