首页 > 其他分享 >抽象工厂模式

抽象工厂模式

时间:2024-09-17 15:02:59浏览次数:10  
标签:String 模式 工厂 AbstractCar 抽象 产品 public

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一个接口,用于创建一系列相关或互相依赖的对象,而无需指定它们的具体类。抽象工厂模式常用于需要创建一组相关或依赖对象的场景,确保这些对象在不同的环境中可以协同工作。

特点

  1. 抽象工厂:定义了一组创建产品的抽象方法,通常一个抽象工厂对应多个产品族(产品家族)。
  2. 具体工厂:实现抽象工厂中的方法,创建一系列具体产品对象。
  3. 抽象产品:定义了产品的接口,各具体产品类实现这个接口。
  4. 具体产品:由具体工厂创建的实例,通常实现抽象产品接口。

实现

抽象工厂模式通过提供多个工厂接口的方法来创建产品,这些方法返回的通常是一组相关联的对象。

//抽象产品
//定义了所有汽车的公共接口,包含两个抽象方法 getType() 和 getColor(),分别用于获取汽车的类型和颜色。具体的汽车类会继承这个抽象类,并实现这些方法。
public abstract class AbstractCar {
    // 车的类型属性
    public abstract String getType();
    // 车的颜色属性
    public abstract String getColor();
}

// 具体产品HatchbackCar
public class HatchbackCar extends AbstractCar{
    private String type = "hatchback";
    private String color = "blue";
    @Override
    public String getType() {
        return type;
    }
    @Override
    public String getColor() {
        return color;
    }
}

// 具体产品JeepCar
public class JeepCar extends AbstractCar {
    private String type = "jeep";
    private String color = "green";
    @Override
    public String getType() {
        return type;
    }
    @Override
    public String getColor() {
        return color;
    }
}

// 具体产品SportCar
class SportCar extends AbstractCar{
    private String type = "sport";
    private String color = "red";
    @Override
    public String getType() {
        return type;
    }
    @Override
    public String getColor() {
        return color;
    }
}

// 抽象工厂
//抽象类定义了一个方法 createCar(),用于创建汽车。具体工厂类将继承这个抽象类并实现具体的创建方法。
public abstract class AbstractFactory {
    // 抽象方法: 创建一辆车
    public abstract AbstractCar createCar();
}

// 抽象工厂HatchbackCarFactory
public class HatchbackCarFactory extends AbstractFactory{
    @Override
    public AbstractCar createCar() {
        return new HatchbackCar();
    }
}
// 抽象工厂JeepCarFactory
public class JeepCarFactory extends AbstractFactory {
    @Override
    public AbstractCar createCar() {
        return new JeepCar();
    }
}
// 抽象工厂SportCarFactory
public class SportCarFactory extends AbstractFactory {
    @Override
    public AbstractCar createCar() {
        return new SportCar();
    }
}

//test
public class TestFactory {
    public static void main(String[] args) {
		//抽象工厂模式
        AbstractFactory hatchbackFactory = new HatchbackCarFactory();
        AbstractCar hatchbackCar = hatchbackFactory.createCar();
        System.out.println("恭喜你获得了一俩超酷的"+hatchbackCar.getColor()+" "+hatchbackCar.getType()+"车");

        AbstractFactory jeepFactory = new JeepCarFactory();
        AbstractCar jeepCar = jeepFactory.createCar();
        System.out.println("恭喜你获得了一俩凶猛的"+jeepCar.getColor()+" "+jeepCar.getType()+"车");

        AbstractFactory sportFactory = new SportCarFactory();
        AbstractCar sportCar = sportFactory.createCar();
        System.out.println("恭喜你获得了一俩拉风的"+sportCar.getColor()+" "+sportCar.getType()+"车");
    }
}

通过不同的工厂类创建不同类型的汽车对象(如 HatchbackCarFactory 创建掀背车,JeepCarFactory 创建越野车,SportCarFactory 创建跑车)。

优点

  1. 一致性:确保由一个工厂生产的产品在同一个产品族中,彼此之间能很好地协同工作。
  2. 易于交换产品族:更换一个产品族只需替换具体工厂,无需更改客户端代码。
  3. 符合开闭原则:增加新的产品族时,只需新增具体工厂类,不需要修改已有代码。

缺点

  1. 复杂性:随着产品族和产品种类的增加,系统会变得更复杂,增加了代码的维护难度。
  2. 扩展困难:添加一个新产品(不是产品族)时,需要修改抽象工厂接口及其所有子类,违背了开闭原则。

使用场景

  1. 系统需要独立于产品的创建和组合:例如跨平台的 GUI 应用,需要根据平台选择不同的控件(如按钮、文本框等)。
  2. 产品族:系统需要由一组相互关联的产品组成,并且产品之间要求兼容,如操作系统的UI组件。
  3. 切换产品族:需要在运行时更换产品族,而不影响客户端代码。

总结

抽象工厂模式适用于创建一组相关或互相依赖的对象,提供了一种使得产品族的创建与使用分离的机制。它使得产品族之间的切换非常容易,且确保了产品族内对象的一致性。然而,随着产品种类的增加,抽象工厂模式的扩展性会受到限制,需要谨慎设计。对于复杂且需要高扩展性的系统,抽象工厂模式是一个非常有力的工具。

标签:String,模式,工厂,AbstractCar,抽象,产品,public
From: https://www.cnblogs.com/20lxj666/p/18384702

相关文章

  • 享元模式
    享元模式(FlyweightPattern)是一种结构型设计模式,旨在通过共享大量细粒度对象来减少内存使用。它在需要创建大量相似对象的场景中尤其有用,通过共享对象来降低内存开销,从而提高性能。核心思想享元模式将对象的状态分为两部分:内部状态(IntrinsicState):不随外部环境改变,可以共享的......
  • 外观模式
    外观模式外观模式(FacadePattern)是一种结构型设计模式,旨在为复杂的子系统提供一个简单的接口。它的核心思想是将系统的复杂性封装在一个统一的接口中,使得外部代码可以通过这个接口简化对复杂系统的操作。主要组成部分外观类(FacadeClass):提供一个简化的接口来访问复杂的子系统......
  • 装饰者模式
    装饰者模式装饰者模式(DecoratorPattern)是一种结构型设计模式,主要用于动态地给对象添加额外的功能,而不改变其结构。这个模式通过创建一个装饰类来包装原始对象,从而扩展其功能。主要角色组件(Component):定义一个接口或抽象类,声明可以被装饰的对象所共有的接口。具体组件(Concrete......
  • 组合模式
    组合模式组合模式(CompositePattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次关系。它允许客户端以统一的方式处理单个对象和对象集合,使得客户端不需要区分具体的对象类型,从而简化了代码的处理逻辑。主要组成部分Component(组件):定义了叶子对象和......
  • 桥接模式
    桥接模式桥接模式(BridgePattern)是一种结构型设计模式,它通过将抽象部分与实现部分分离,从而使它们可以独立地变化。这个模式的主要目的是解耦抽象和实现,使得它们可以独立地变化和扩展。主要概念抽象(Abstraction):这是一个接口或抽象类,它定义了高层次的操作。修正抽象(RefinedA......
  • 【加密算法基础——AES CBC模式代码解密实践】
    AES解密实践之代码实现AES解密使用python脚本比较灵活,但是一定要保证脚本是调试过的,才能在找到正确的密文,密钥,初始向量的情况下,解出正确的明文。但是对于AES解密,命令行无法处理key截断的问题。实际测试了一下,CBC模式,对于key截断的问题可以解决,但是CFB模式,目前还无法实验......
  • 设计模式---- 门面模式
    门面模式门面模式(FacadePattern)是一种结构型设计模式,用于为复杂子系统提供一个统一、简单的接口,隐藏系统的复杂性。通过门面模式,客户端无需直接与系统的内部组件交互,而是通过门面类与系统打交道,简化了客户端的使用,降低了系统的复杂性和耦合度。门面模式的主要概念定义:门面模......
  • 攻防世界 ————新手模式适合作为桌面 misc
    (本篇文章参考大佬的解题)下载附件,得到rar的的压缩包,解压缩,打开文件后有一张图片:打开图片发现什么也没有:使用软件Stegsolve打开图片看有什么问题:点击下一页:点击后发现有一个二维码:把他保存下来,使用软件扫码看看里面有什么:(我是用微信扫码的)出现了十六进制的数字:把他复......
  • 设计模式---- 工厂模式
    工厂模式工厂模式是一种创建型设计模式,它的主要目的是将对象的创建过程与对象的使用过程分离。工厂模式通过引入工厂类或者工厂方法,隐藏对象创建的复杂性,使得代码更加灵活、可扩展。工厂模式的使用场景主要在于:当我们需要对创建的对象进行封装或延迟创建时,工厂模式是一个很好的选......
  • 反DDD模式之关系型数据库
    本文书接上回《图穷匕见-所有反DDD模式都是垃圾》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术实现交流;视频和直播在B站。背景我在与开发者交流关于DDD的建模思路时,往往会遇到一个难题,就是不少经验丰富的开发者,总是带着技......