23种设计模式之工厂模式

23种设计模式之工厂模式 工厂模式属于创建型设计模式核心思想封装对象创建逻辑统一生产对象隔离对象创建与使用。工厂模式分三大类简单工厂静态工厂1 个工厂 N 个产品,工厂依赖抽象产品工厂方法N 个工厂 N 个产品,1 个工厂对应 1 个产品抽象工厂N 个工厂 多组产品产品族,1 个工厂对应一整套产品一、简单工厂模式Simple Factory1. 定义由一个工厂类负责创建所有产品实例根据传入参数决定创建哪一个对象。不属于 GoF 23 种标准设计模式2. 角色抽象产品产品统一接口/父类具体产品接口实现类工厂类核心包含创建对象逻辑3. 适用场景产品种类少、创建逻辑简单客户端只需传入标识就能获取对象。4. 代码和UMl类图// 1. 抽象产品 public interface Fruit { void eat(); } // 2. 具体产品 class Apple implements Fruit { Override public void eat() { System.out.println(吃苹果); } } class Banana implements Fruit { Override public void eat() { System.out.println(吃香蕉); } } // 3. 工厂类 class FruitFactory { // 静态方法简单工厂核心 public static Fruit createFruit(String type) { if (apple.equals(type)) { return new Apple(); } else if (banana.equals(type)) { return new Banana(); } return null; } } // 客户端 public class Client { public static void main(String[] args) { Fruit apple FruitFactory.createFruit(apple); apple.eat(); } }5. 优缺点优点创建逻辑集中客户端不用new对象缺点违背开闭原则新增产品必须修改工厂代码产品多时代码臃肿二、工厂方法模式Factory Method⭐ 标准23种模式之一1. 定义一个产品对应一个工厂定义抽象工厂接口让具体工厂创建对应具体产品。完全遵循开闭原则新增产品只需要新增对应工厂不修改原有代码。2. 角色抽象产品具体产品抽象工厂定义创建产品的抽象方法具体工厂实现抽象工厂生产对应产品3. 适用场景产品种类较多且频繁新增产品需要严格遵守开闭原则。4. 代码和uml类型图// 1. 抽象产品 public interface Fruit { void eat(); } // 具体产品 class Apple implements Fruit { Override public void eat() { System.out.println(吃苹果); } } class Banana implements Fruit { Override public void eat() { System.out.println(吃香蕉); } } // 2. 抽象工厂 public interface FruitFactory { Fruit createFruit(); } // 3. 具体工厂 class AppleFactory implements FruitFactory { Override public Fruit createFruit() { return new Apple(); } } class BananaFactory implements FruitFactory { Override public Fruit createFruit() { return new Banana(); } } // 客户端 public class Client { public static void main(String[] args) { FruitFactory factory new AppleFactory(); Fruit fruit factory.createFruit(); fruit.eat(); } }​5. 优缺点优点遵守开闭原则单一职责一个工厂只生产一种产品缺点类数量爆炸每加一个产品就要加一个工厂类三、抽象工厂模式Abstract Factory⭐ 标准23种模式之一1. 定义工厂生产「产品族」而非单个产品。产品族一组相关/配套的产品如手机 耳机 一套数码产品产品等级同类型不同品牌如小米手机、华为手机2. 核心区别对比工厂方法工厂方法一个工厂只生产一类产品单一产品抽象工厂一个工厂生产一整套产品产品族3. 角色抽象产品多个产品A、产品B具体产品抽象工厂定义多个创建方法对应不同产品具体工厂实现整套产品的创建4. 适用场景系统存在多组配套产品产品之间有约束、必须搭配使用。5. 代码Java和uml类图场景数码产品族手机、耳机两个品牌小米、华为// 抽象产品 // 手机抽象 public interface Phone { void call(); } // 耳机抽象 public interface Headset { void listen(); } ​ // 具体产品 // 小米产品 class XiaomiPhone implements Phone { Override public void call() { System.out.println(小米手机通话); } } class XiaomiHeadset implements Headset { Override public void listen() { System.out.println(小米耳机听歌); } } // 华为产品 class HuaweiPhone implements Phone { Override public void call() { System.out.println(华为手机通话); } } class HuaweiHeadset implements Headset { Override public void listen() { System.out.println(华为耳机听歌); } } ​ // 抽象工厂生产整套产品 public interface DigitalFactory { Phone createPhone(); Headset createHeadset(); } ​ // 具体工厂品牌工厂生产整个产品族 class XiaomiFactory implements DigitalFactory { Override public Phone createPhone() { return new XiaomiPhone(); } Override public Headset createHeadset() { return new XiaomiHeadset(); } } class HuaweiFactory implements DigitalFactory { Override public Phone createPhone() { return new HuaweiPhone(); } Override public Headset createHeadset() { return new HuaweiHeadset(); } } ​ // 客户端 public class Client { public static void main(String[] args) { DigitalFactory factory new XiaomiFactory(); Phone phone factory.createPhone(); Headset headset factory.createHeadset(); phone.call(); headset.listen(); } }6. 优缺点优点保证产品族配套使用新增品牌工厂方便(苹果工厂)符合开闭缺点新增产品等级非常麻烦比如新增「手表」所有工厂都要改四、三种工厂模式对比总结模式特点开闭原则适用场景简单工厂单工厂、多产品靠参数判断不满足产品固定、很少新增工厂方法一产品对应一工厂满足单一产品类型频繁加产品抽象工厂工厂生产整套产品族产品族扩展友好产品等级扩展困难多组配套产品五、实际开发使用建议简单工厂日常快速开发、工具类、内部组件最常用工厂方法框架、开源组件、需要持续迭代扩展的模块抽象工厂电商多产品线、软硬件配套、跨平台多组件场景六、常见面试考点工厂模式的作用解耦对象创建与使用、统一管理实例、屏蔽创建细节简单工厂为什么不算标准23种设计模式破坏开闭原则工厂方法 vs 抽象工厂单一产品vs产品族开闭原则在三种模式中的体现