java设计模式[抽象工厂模式]

科技资讯 投稿 12100 0 评论

java设计模式[抽象工厂模式]

java设计模式【抽象工厂模式】

抽象工厂模式

抽象工厂模式是对简单工厂模式的一个变种,它允许通过一个统一的接口来创建不同的产品实例,而无需指定具体的子类。在这个模式中,我们只关心产品的抽象接口,而将具体的产品实现留给子类去实现。这样,我们可以通过创建不同的工厂对象来创建不同的产品实例,而无需关心它们实际实现的是哪个具体产品。

    定义抽象产品接口:抽象工厂模式的核心是抽象产品接口,它定义了产品的基本结构和行为。
  1. 定义具体工厂接口:具体工厂接口是实现抽象产品接口的工厂类,它们负责创建具体产品实例。
  2. 定义工厂:每个具体工厂都是一个特定领域的工厂,它实现了抽象工厂接口,并提供了具体的产品实现。
  3. 创建产品实例:使用抽象工厂接口,客户端可以创建不同的产品实例,而无需指定具体的子类。

优缺点

优点:
    具体产品在应用层的代码隔离,无需关系创建的细节。
  1. 将一个系列的产品统一到一起创建,方便产品族的扩展。
  2. 提供一个产品类的库,所有的产品以同样的接口出现,使得客户端不依赖于具体实现。
  3. 通过创建不同的工厂对象来创建不同的产品实例,无需关心它们实际实现的是哪个具体产品。

缺点:

    规定了所有可能被创建的产品集合,产品族中扩展新的产品困难。
  1. 增加了系统的抽象性和理解难度。
  2. 使用场景:客户端(应用层)不依赖与产品类的实现等细节。
  3. 需要大量的重复代码,增加了开发和维护的成本。

使用场景

    一个系统要独立于它的产品的创建、组合和表示时。
  1. 一个系统要由多个产品系列中的一个来配置时。
  2. 需要强调一系列相关的产品对象的设计以便进行联合使用时。
  3. 提供一个产品类库,而只想显示它们的接口而不是实现时。
  4. 产品之间相互关联、相互依赖且相互约束的地方。

具体实现

定义抽象工厂

/**
 * 智能产品抽象工厂
 */
public interface SmartProductFactory {

    ISmartPhone createSmartPhone(;

    ISmartCar createSmartCar(;

}

具体工厂

/**
 * @author physicx
 * @date 2023/5/17 上午11:18
 * @desc 华为工厂
 * Created with IntelliJ IDEA
 */
public class HuaweiFactory implements SmartProductFactory {
    @Override
    public ISmartPhone createSmartPhone( {
        return new HuaweiSmartPhone(;
    }

    @Override
    public ISmartCar createSmartCar( {
        return new HuaweiSmartCar(;
    }
}
/**
 * @author guogq
 * @date 2023/5/17 上午11:18
 * @desc 小米工厂
 * Created with IntelliJ IDEA
 */
public class XiaomiFactory implements SmartProductFactory {
    @Override
    public ISmartPhone createSmartPhone( {
        return new XiaomiSmartPhone(;
    }

    @Override
    public ISmartCar createSmartCar( {
        return new XiaomiSmartCar(;
    }
}

定义抽象产品

/**
 * 智能手机
 */
public interface ISmartPhone {

    void printInfo(;

}
/**
 * 智能汽车
 */
public interface ISmartCar {
    void printInfo(;
}

具体产品

/**
 * @author physicx
 * @date 2023/5/17 上午11:19
 * @desc 华为智能汽车
 * Created with IntelliJ IDEA
 */
public class HuaweiSmartCar implements ISmartCar {
    @Override
    public void printInfo( {
        System.out.println("华为智能汽车";
    }
}
/**
 * @author guogq
 * @date 2023/5/17 上午11:19
 * @desc 华为智能手机
 * Created with IntelliJ IDEA
 */
public class HuaweiSmartPhone implements ISmartPhone {
    @Override
    public void printInfo( {
        System.out.println("华为智能手机";
    }
}
/**
 * @author guogq
 * @date 2023/5/17 上午11:19
 * @desc 小米智能汽车
 * Created with IntelliJ IDEA
 */
public class XiaomiSmartCar implements ISmartCar {
    @Override
    public void printInfo( {
        System.out.println("小米智能汽车";
    }
}
/**
 * @author guogq
 * @date 2023/5/17 上午11:19
 * @desc 小米智能手机
 * Created with IntelliJ IDEA
 */
public class XiaomiSmartPhone implements ISmartPhone {
    @Override
    public void printInfo( {
        System.out.println("小米智能手机";
    }
}

客户端调用

public static void main(String[] args {
        HuaweiFactory huaweiFactory = new HuaweiFactory(;
        huaweiFactory.createSmartPhone(.printInfo(;
        huaweiFactory.createSmartCar(.printInfo(;

        XiaomiFactory xiaomiFactory = new XiaomiFactory(;
        xiaomiFactory.createSmartPhone(.printInfo(;
        xiaomiFactory.createSmartCar(.printInfo(;
    }

打印如下:

工厂方法模式和抽象工厂模式区别

工厂方法模式和抽象工厂模式都是创建型模式,区别如下:

    工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
  1. 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
  2. 工厂方法模式的使用很简单,只要继承成子类,并实现工厂方法的工厂就可以了,而抽象工厂模式需要先实例化它,然后将它传入一些针对抽象类型所写的代码中。
  3. 工厂方法模式的优点是可以把一群相关的产品集合起来,而抽象工厂模式的优点是可以把一群相关的产品集合起来,并且创建整个产品家族的模式。

总之,工厂方法是由子类自行决定实例化那个类,而抽象工厂是自己决定实例化哪个类。至于是组合还是继承还是实现接口都无所谓。根本区别在于是自己实例化还是子类实例化。

补充说明

后续会依次更新 详解java 23种设计模式,欢迎关注、交流、补充相关内容(如下)。

快捷导航
设计模式简介总结
单例模式详解
工厂方法模式
抽象工厂模式

编程笔记 » java设计模式[抽象工厂模式]

赞同 (59) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽