Java23设计模式学习(课时三)抽象工厂模式

简介: Java23设计模式学习(课时三)抽象工厂模式

抽象工厂模式的定义:

抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。


工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列。


案例走起:在代码中理解设计模式学的思想:


本案例大纲

Java的案例大纲

package coms.Design.Mode.abstact1;
/**
 * 抽象产品工厂
 * 总工厂
 * 生产手机
 * 定义生产产品的类型
 */
public interface IProductFactory {
    //生产手机产品
    IphoneProduct phoneProduct();
    //生产路由器产品
    IRouterProduct  routerProduct();
}

上面的 IProductFactory 是项目的总工厂 来设计产品的类型

package coms.Design.Mode.abstact1;
//手机产品接口
public interface IphoneProduct {
    void start();
    void shutdown();
    void callup();
    void sendSms();
    void reading();
}
package coms.Design.Mode.abstact1;
//路由器产品接口
public interface IRouterProduct {
    void  start();
    void shutdown();
    void  openwife();
    void seting();
    void X();
}

IRouterProduct  这是从总工厂中分离出来的一种产品为路由器

IphoneProduct  这是从总工厂中分离出来的一种产品为手机


先看华为工厂的代码:

package coms.Design.Mode.abstact1;
/**
 * 华为工厂
 */
public class HuWeiFactory  implements IProductFactory{
//手机系列
    @Override
    public IphoneProduct phoneProduct() {
        return new HuWeiPhone();
    }
//路由器系列
    @Override
    public IRouterProduct routerProduct() {
        return new HuWeiRouter();
    }
}
package coms.Design.Mode.abstact1;
/**
 * 华为手机
 */
public class HuWeiPhone implements  IphoneProduct{
    @Override
    public void start() {
        System.out.println("开启华为手机");
    }
    @Override
    public void shutdown() {
        System.out.println("关闭华为手机");
    }
    @Override
    public void callup() {
        System.out.println("开启华为手机打电话");
    }
    @Override
    public void sendSms() {
        System.out.println("开启华为手机发信息");
    }
    @Override
    public void reading() {
        System.out.println("开启华为手机阅读数据");
    }
}
package coms.Design.Mode.abstact1;
/**
 * 小米路由器
 */
public class HuWeiRouter implements IRouterProduct{
    @Override
    public void start() {
        System.out.println("开启华为路由器");
    }
    @Override
    public void shutdown() {
        System.out.println("关闭华为路由器");
    }
    @Override
    public void openwife() {
        System.out.println("华为打开WiFi");
    }
    @Override
    public void seting() {
        System.out.println("华为设置参数");
    }
    @Override
    public void X() {
        System.out.println("华为未知参数X");
    }
}

在看小米系列

package coms.Design.Mode.abstact1;
public class XiaomiFactory implements IProductFactory{
    @Override
    public IphoneProduct phoneProduct() {
        //创造小米手机
        return new XiaomiPhone();
    }
    @Override
    public IRouterProduct routerProduct() {
        //创造小米路由器
        return new XiaomiRouter();
    }
}
package coms.Design.Mode.abstact1;
/**
 * 小米手机
 */
public class XiaomiPhone implements  IphoneProduct{
    @Override
    public void start() {
        System.out.println("开启小米手机");
    }
    @Override
    public void shutdown() {
        System.out.println("关闭小米手机");
    }
    @Override
    public void callup() {
        System.out.println("开启小米手机打电话");
    }
    @Override
    public void sendSms() {
        System.out.println("开启小米手机发信息");
    }
    @Override
    public void reading() {
        System.out.println("开启小米手机阅读数据");
    }
}
package coms.Design.Mode.abstact1;
import java.security.spec.RSAOtherPrimeInfo;
/**
 * 小米路由器
 */
public class XiaomiRouter implements IRouterProduct{
    @Override
    public void start() {
        System.out.println("开启路由器");
    }
    @Override
    public void shutdown() {
        System.out.println("关闭路由器");
    }
    @Override
    public void openwife() {
        System.out.println("小米打开WiFi");
    }
    @Override
    public void seting() {
        System.out.println("小米设置参数");
    }
    @Override
    public void X() {
        System.out.println("小米未知参数X");
    }
}

在看测试类

package coms.Design.Mode.abstact1;
/**
 * 测试类
 */
public class ClientTest {
    public static void main(String[] args) {
        System.out.println("========================小米产品=======================");
        XiaomiFactory xiaomiFactory = new XiaomiFactory();
        IphoneProduct iphoneProduct = xiaomiFactory.phoneProduct();
        iphoneProduct.reading();
        iphoneProduct.shutdown();
        System.out.println("==================小米路由器=================");
        IRouterProduct iRouterProduct = xiaomiFactory.routerProduct();
        iRouterProduct.openwife();
        iRouterProduct.start();
        iRouterProduct.X();
        System.out.println("========================华为系列产品=======================");
        HuWeiFactory huWeiFactory = new HuWeiFactory();
        IphoneProduct iphoneProduct1 = huWeiFactory.phoneProduct();
        iphoneProduct1.reading();
        iphoneProduct1.shutdown();
        System.out.println("==================华为路由器=================");
        IRouterProduct iRouterProduct1 = huWeiFactory.routerProduct();
        iRouterProduct1.openwife();
        iRouterProduct1.start();
        iRouterProduct1.X();
    }
}

代码解读

第一步 创建小米工厂


XiaomiFactory xiaomiFactory = new XiaomiFactory();


第二步:在小米工厂调用phoneProduct()

IphoneProduct iphoneProduct = xiaomiFactory.phoneProduct();


第三步 iphoneProduct.动作名

iphoneProduct.reading();

理清楚下面的关系:

1 在HuWeiFactory和XiaomiFactory 两个工厂中。

public class HuWeiFactory  implements IProductFactory{
public class XiaomiFactory implements IProductFactory{

2 在HuWeiPhone和HuWeiRouter 的两个实现类中分别实现的是 产品和路由器。

public class HuWeiPhone implements  IphoneProduct{
public class HuWeiRouter implements IRouterProduct{

3 同理  在XiaomiPhone和XiaomiRouter 的两个实现类中分别实现的是 产品和路由器。

关系理清楚了自己去画流程图吧!


工厂模式


◆小结:


◆简单工厂模式(静态工厂模式)


◆虽然某种程度 上不符合设计原则,但实际使用最多!◆工厂方法模式I


◆不修改已有类的前提下,通过增加新的工厂类实现扩展。◆抽象工厂模式


◆不可以增加产品,可以增加产品族!


◆应用场景:


◆JDK中Calendar的getInstance方法◆JDBC中的Connection对象的获取Spring中IOC容器创建管理bean对象◆反射中Class对象的newInstance方法

相关文章
|
7月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
911 157
|
7月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
722 2
|
7月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
386 1
|
8月前
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
217 1
|
7月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
577 0
|
7月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
1677 35
|
7月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
538 8
|
7月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
652 8
|
8月前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
120 5
|
8月前
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
204 5