23种设计模式(第一部分): 1.工厂模式(包含简单工厂模式,方法工厂模式简介相关代码示例) 2. 抽象工厂模式(相关代码,思想学习)

it2025-09-11  4

一. 工厂模式

作用

实现了创建者和调用者分离详细分类 简单工厂模式 工厂方法模式 抽象工厂模式 OOP七大原则 开闭原则: 对扩展开放,对修改关闭 依赖倒置原则: 面向接口编程,不要面向实现编程 迪米特法则: 只与你的直接朋友交谈,不跟陌生人说话

核心本质

实例化对象不使用new,用工厂方法代替将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦

三种模式

简单工厂模式 用来生产同一等级结构中的任意产品(对于增加新的产品,需要求该已有代码)工厂方法模式 用来生产同一等级结构中的固定产品(支持增加任意的产品)抽象工厂模式 围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂

代码演示:

接口部分:

public interface Car { void name(); }

车辆部分:

package com.qiu.factory.simple; public class Tesla implements Car{ @Override public void name() { System.out.println("特斯拉!"); } } package com.qiu.factory.simple; public class WuLing implements Car{ @Override public void name() { System.out.println("五菱宏光!"); } }

简单工厂实现:

package com.qiu.factory.simple; public class CarFactory { //这就是静态工厂模式 //车工厂 : 方法一 public static Car getCar(String car){ if (car.equals("五菱")){ return new WuLing(); } if (car.equals("特斯拉")){ return new Tesla(); } return null; } //方法二 public static Car getWuLing(){ return new WuLing(); } public static Car getTesla(){ return new Tesla(); } }

这种就是简单的工厂模式,但是有个小问题就是我们在增加车辆的时候需要对源码进行修改,所以需要进行改进

改进:工厂方法模式

Car:

package com.qiu.factory.method; public interface Car { void name(); }

CarFactory:

package com.qiu.factory.method; /** * //工厂方法模式 * @author qiuzhikang */ public interface CarFactory { Car getCar(); }

tesla:

package com.qiu.factory.method; public class Tesla implements Car { @Override public void name() { System.out.println("特斯拉!"); } }

TeslaFactory:

package com.qiu.factory.method; public class TeslaFactory implements CarFactory{ @Override public Car getCar() { return new Tesla(); } }

consumer:

package com.qiu.factory.method; /** * @author qiuzhikang */ public class Consumer { public static void main(String[] args) { Car car = new WuLingFactory().getCar(); Car car1 = new TeslaFactory().getCar(); car.name(); car1.name(); Car car2 = new MoBaiFactory().getCar(); car2.name(); } } 结构复杂度: simple代码复杂度: simple编程复杂度: simole管理上的复杂度: simple

总结:

根据设计原则:工厂方法原则根据实例业务:简单工厂模式

二. 抽象工厂模式

定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类使用场景: 客户端(应用层) 不依赖于产品类实例如何被创建,实现等细节强调一系列相关的产品对象(属于同一产品族) 一起使用创建对象需要大量的重复代码提供一个产品类的库,所有产品以同样的接口出现,从而使得客户端不依赖于具体的实现 优点 具体的产品在应用层隔离,无需关心创建的细节将一个一系列的产品同样到一起创建 缺点 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难增加了系统的抽象性和理解难度

Creator: (产品族工厂)定义了一系列的产品ConcreteCreator1: 具体的产品族工厂(比如说华为)ConcreteCreator2: 具体的产品族工厂(比如说小米)productA: 接口.定义了产品的功能productA1:具体的产品 同理:B,B1同上.

结构图: 部分代码:

接口部分:

package com.qiu.factory.abstract1; /** * 抽象产品工厂 * @author qiuzhikang */ public interface IProductFactory { //生产手机 IphoneProduct iphoneProduct(); //生产路由器 IRoutePruduct routerProduct(); } package com.qiu.factory.abstract1; /** * 手机产品接口 * @author qiuzhikang */ public interface IphoneProduct { void start(); void shotdown(); void callup(); void sendSMS(); } package com.qiu.factory.abstract1; /** * 路由器产品接口 * @author qiuzhikang */ public interface IRoutePruduct { void start(); void shotdown(); void openwife(); void setting(); }

实现部分:

package com.qiu.factory.abstract1; /** * 华为工厂 * @author qiuzhikang */ public class HuaweiFactory implements IProductFactory{ @Override public IphoneProduct iphoneProduct() { return new HuaweiProduct(); } @Override public IRoutePruduct routerProduct() { return new HuaweiRouter(); } } package com.qiu.factory.abstract1; public class HuaweiProduct implements IphoneProduct{ @Override public void start() { System.out.println("华为手机开机"); } @Override public void shotdown() { System.out.println("华为手机关机"); } @Override public void callup() { System.out.println("华为手机打电话"); } @Override public void sendSMS() { System.out.println("华为手机发短信"); } } package com.qiu.factory.abstract1; public class HuaweiRouter implements IRoutePruduct{ @Override public void start() { System.out.println("华为路由器开机"); } @Override public void shotdown() { System.out.println("华为路由器关机"); } @Override public void openwife() { System.out.println("华为路由器开启wifi"); } @Override public void setting() { System.out.println("华为路由器设置"); } }

客户部分:

package com.qiu.factory.abstract1; public class Client { public static void main(String[] args) { System.out.println("小米系列产品=================="); XiaomiFactory xiaomiFactory = new XiaomiFactory(); IphoneProduct iphoneProduct = xiaomiFactory.iphoneProduct(); iphoneProduct.callup(); iphoneProduct.sendSMS(); IRoutePruduct iRoutePruduct = xiaomiFactory.routerProduct(); iRoutePruduct.openwife(); iphoneProduct.sendSMS(); System.out.println("华为系列产品=================="); HuaweiFactory huaweiFactory = new HuaweiFactory(); IphoneProduct iphoneProduct1 = huaweiFactory.iphoneProduct(); iphoneProduct1.sendSMS(); iphoneProduct1.callup(); IRoutePruduct iRoutePruduct1 = huaweiFactory.routerProduct(); iRoutePruduct1.openwife(); iRoutePruduct1.setting(); } }

小米产品同上一致

工厂模式和抽象工厂模式小结

小结:

简单工厂模式(静态工厂模式) 虽然某种程度上不符合设计原则,但是实际使用最多工厂方法模式 不可以修改已有类的前提下,通过增加新的工厂类实现扩展抽象工厂模式 不可以增加产品,可以增加产品族

应用场景

JDK中的Calendar 的getInstance()方法JDBC中的Connection对象的获取spring中ioc容器创建管理bean对象反射中Class对象的newInstance
最新回复(0)