java中抽象工厂模式_Java描述设计模式(04):抽象工厂模式

一、抽象工厂模式

1、生活场景

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

2、抽象工厂模式

1) 抽象工厂模式:定义了一个interface用于创建相关对象或相互依赖的对象,而无需指明具体的类;

2) 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合;

3) 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。

4) 将工厂抽象成两层,AbstractFactory(抽象工厂) 和 具体实现的工厂子类,方便程序扩展。

3、代码UML图

e9507f41caf2a19641a7926c32391581.png

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、核心配置

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、结构分析

ea6814a0d4833d46589624f0b52eb8d4.png

059d28f852696b3073a5b93ce7c2e943.png

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

三、工厂模式小结

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

四、源代码地址

GitHub地址:知了一笑

https://github.com/cicadasmile

码云地址:知了一笑

https://gitee.com/cicadasmile

fb40ee901ad56b322ad90ac8698c296d.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值