Java描述设计模式(04):抽象工厂模式

Wesley13
• 阅读 694

一、抽象工厂模式

1、生活场景

汽车生产根据用户选择的汽车类型,指定不同的工厂进行生产,选择红旗轿车,就要使用中国工厂,选择奥迪轿车,就要使用德国工厂。

2、抽象工厂模式

  1. 抽象工厂模式:定义了一个interface用于创建相关对象或相互依赖的对象,而无需指明具体的类;
  2. 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合;
  3. 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
  4. 将工厂抽象成两层,AbstractFactory(抽象工厂) 和 具体实现的工厂子类,方便程序扩展。

3、代码UML图

Java描述设计模式(04):抽象工厂模式

4、源代码实现

/**
 * 抽象工厂模式
 */
public class C01_AbstractFactory {
    public static void main(String[] args) {
        CarProductFactory factory = new ChinaCarFactory() ;
        factory.getCar("hq") ;
        factory = new GermanyCarFactory () ;
        factory.getCar("ad") ;
    }
}

// 汽车生产抽象工厂
interface CarProductFactory {
    CarProduct getCar (String type) ;
}
// 中国汽车工厂
class ChinaCarFactory implements CarProductFactory {
    @Override
    public CarProduct getCar(String type) {
        CarProduct product = null ;
        if ("hq".equals(type)){
            product = new HQCar() ;
            product.name="红旗一号" ;
            product.date="1999-09-19" ;
            product.material();
            product.origin();
        } else if ("df".equals(type)){
            product = new DFCar() ;
            product.name="东风一号" ;
            product.date="2019-09-19" ;
            product.material();
            product.origin();
        }
        return product ;
    }
}
// 德国汽车工厂
class GermanyCarFactory implements CarProductFactory {
    @Override
    public CarProduct getCar(String type) {
        CarProduct product = null ;
        if ("ad".equals(type)){
            product = new ADCar() ;
            product.name="奥迪A8" ;
            product.date="2017-09-19" ;
            product.material();
            product.origin();
        } else if ("bm".equals(type)){
            product = new BMCar() ;
            product.name="宝马X8" ;
            product.date="2018-09-19" ;
            product.material();
            product.origin();
        }
        return product ;
    }
}
// 汽车生产抽象类
abstract class CarProduct {
    /**
     * 汽车名称
     */
    protected String name ;
    /**
     * 生产日期
     */
    protected String date ;
    /**
     * 材料
     */
    abstract void material () ;
    /**
     * 产地
     */
    abstract void origin () ;
}
// 红旗车
class HQCar extends CarProduct {
    @Override
    void material() {
        System.out.println(super.name+"材料...");
    }
    @Override
    void origin() {
        System.out.println(super.date+":"+super.name+"在中国北京生产");
    }
}
// 东风车
class DFCar extends CarProduct {
    @Override
    void material() {
        System.out.println(super.name+"材料...");
    }
    @Override
    void origin() {
        System.out.println(super.date+":"+super.name+"在中国南京生产");
    }
}
// 奥迪车
class ADCar extends CarProduct {
    @Override
    void material() {
        System.out.println(super.name+"材料...");
    }
    @Override
    void origin() {
        System.out.println(super.date+":"+super.name+"在德国柏林生产");
    }
}
// 宝马车
class BMCar extends CarProduct {
    @Override
    void material() {
        System.out.println(super.name+"材料...");
    }
    @Override
    void origin() {
        System.out.println(super.date+":"+super.name+"在德国慕尼黑生产");
    }
}

二、Spring框架应用

1、场景描述

Spring框架中获取配置文件中Bean的多种方式。

2、核心配置

<bean id="carBean" class="com.model.design.spring.node04.abstractFactory.CarBean">
    <property name="name" value="中国红旗" />
</bean>
<bean id="carBean1" class="com.model.design.spring.node04.abstractFactory.CarBean">
    <property name="name" value="德国奥迪" />
</bean>

3、测试文件

这里使用了两种方式获取。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/spring/spring-abstract-factory.xml"})
public class SpringTest {

    @Resource
    private BeanFactory beanFactory ;

    @Test
    public void test01 (){
        CarBean carBean = (CarBean)beanFactory.getBean("carBean") ;
        System.out.println(carBean.getName());
    }

    @Test
    public void test02 (){
        ApplicationContext context01 = new ClassPathXmlApplicationContext(
                "/spring/spring-abstract-factory.xml");
        CarBean carBean = (CarBean)context01.getBean("carBean1") ;
        System.out.println(carBean.getName());
    }
}

4、结构分析

Java描述设计模式(04):抽象工厂模式 Java描述设计模式(04):抽象工厂模式

抽象工厂封装对象的创建。在Spring中,通过实现BeanFactory。可以从Spring的各种容器获取bean。根据Bean的配置,getBean方法可以返回不同类型的对象(单例作用域)或初始化新的对象(原型作用域)。在BeanFactory的实现中,我们可以区分:ClassPathXmlApplicationContext,XmlWebApplicationContext等。

三、工厂模式小结

三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式),工厂模式的核心用意将实例化对象的代码封装起来,放到工厂类中统一管理和维护,完成代码依赖关系的解耦。从而提高程序的可扩展性和维护性。

四、源代码地址

GitHub地址:知了一笑
https://github.com/cicadasmile/model-arithmetic-parent
码云地址:知了一笑
https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述设计模式(04):抽象工厂模式 Java描述设计模式(04):抽象工厂模式

点赞
收藏
评论区
推荐文章
zdd小小菜鸟 zdd小小菜鸟
2年前
创建型-2-抽象工厂模式( Abstract Factory Pattern )
创建型2抽象工厂模式(AbstractFactoryPattern)抽象工厂模式(AbstractFactoryPattern)是围绕一个超级工厂创建其他工厂tex该超级工厂又称为其他工厂的工厂在抽象
Wesley13 Wesley13
3年前
Java设计模式之三种工厂模式
工厂模式实现了创建者和调用者的分离,实现了更好的解耦。详细分类:1)简单工厂模式(静态工厂模式);2)工厂方法模式;3)抽象工厂模式面向对象设计的基本原则:1)      OCP(开闭原则,OpenClosedPrinciple):一个软件的实体应当对扩展开放,对修改关闭。2)      
Wesley13 Wesley13
3年前
Unity C# 设计模式(二)简单工厂模式
定义:简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactoryMethod)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该
Wesley13 Wesley13
3年前
Java进阶篇设计模式之三
前言在上一篇(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fxuwujing%2Fp%2F9363142.html)中我们学习了工厂模式,介绍了简单工厂模式、工厂方法和抽象工厂模式。本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式。
Wesley13 Wesley13
3年前
Java中23种设计模式详解
Java中23种设计模式1\.设计模式31.1创建型模式41.1.1工厂方法41.1.2抽象工厂61.1.3建造者模式101.1.4单态模式131.1.5原型模式151.2结构型模式171.2.1适配器模式171.2.2桥接模式191.2.3组合
Stella981 Stella981
3年前
Python之设计模式
一、设计模式分类a、创建型模式简单工厂模式一、内容不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。二、角色工厂角色(Creator)抽象产品角色(Product)具体产品角色(ConcreteProduct)
Wesley13 Wesley13
3年前
C#设计模式 —— 工厂模式
。  工厂模式同样是项目中最常用的设计模式,工厂模式中又分为简单工厂,工厂方法,抽象工厂。下面我们由简单的开始逐一介绍。1.简单工厂模式  简单工厂又被称为静态工厂,在设计模式中属于创建型模式。主要解决的问题是封装了实例化的过程,通过传入参数来获不同实例。下面我们举一个项目中可能会用到的例子。  假设我们程序的数据保存在几个不同
Wesley13 Wesley13
3年前
C++ 深入浅出工厂模式(进阶篇)
介绍前文初始篇C深入浅出工厂模式(初始篇)(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fxiaolincoding%2Fp%2F11524376.html),主要阐述了简单工厂模式、工厂方法模式和抽象工厂模式的结构、特点和缺陷等。以
Wesley13 Wesley13
3年前
23种设计模式(面向对象语言)
一、设计模式的分类总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。所有的创建型模式都有两个主要功能:  1.将系统所使用的具体类的信息封装起来  2.隐藏
Wesley13 Wesley13
3年前
JS创建对象模式7种方法详解
创建对象的几种模式虽然Object构造函数或者字面量,都可以用来创建对象,但这些方式有明显的缺点:使用同一个接口创建很多对象,会产生大量的代码,于是,工厂模式诞生了1工厂模式工厂模式是广为人知的设计模式,抽象了创建具体对象的过程。在ES6的Class创建类之前,是无法创建类的,开发人员就发明了一种函数,用函数来封