您现在的位置:首页 >> 基础 >> Java编程 >> 内容

Java面试专题之六:设计模式学习,详细分析抽象工厂模式

时间:2020-11-4 10:52:30

  核心提示:所谓抽象工厂模式就是提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。他允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么。这样一来,客户就可以从具...

所谓抽象工厂模式就是提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。

他允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么。这样一来,客户就可以从具体的产品中被解耦。

它的优点是隔离了具体类的生成,使得客户端不需要知道什么被创建了,而缺点就在于新增新的行为会比较麻烦,因为当添加一个新的产品对象时,需要更加需要更改接口及其下所有子类。其UML结构图如下:

优点:

  • 分离接口和实现。客户端面向产品的接口编程,从具体的产品实现中解耦。
  • 可以很方便的生产或切换产品系列。

缺点:

  • 不太容易扩展新产品。假如我们要给产品系列添加新的产品耳麦,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。

代码实例

假设汽车发动机和轮子是我们需要的产品,生产发动机和轮子的奔驰和宝马是我们的工厂。

1、创建发动机接口和具体的发动机实现类

Engine.java

/**
 * 发动机接口
 */
public interface Engine {

	/**
	 * 启动发动机
	 */
	public void start();
}

BenEngine.java

/**
 * 奔驰发动机
 */
public class BenEngine implements Engine {

	@Override
	public void start() {
		System.out.println("启动奔驰发动机!");
	}

}

BmEngine.java

/**
 * 宝马发动机
 */
public class BmEngine implements Engine {

	@Override
	public void start() {
		System.out.println("启动宝马发动机");
	}

}

2、创建轮子接口和具体的轮子实现类

Wheel.java

/**
 * 轮子接口
 */
public interface Wheel {

	/**
	 * 转动轮子
	 */
	public void turn();
}

BenWheel.java

/**
 * 奔驰轮子
 */
public class BenWheel implements Wheel {

	@Override
	public void turn() {
		System.out.println("汽车用奔驰轮子");
	}

}

BmWheel.java

/**
 * 宝马轮子
 */
public class BmWheel implements Wheel {

	@Override
	public void turn() {
		System.out.println("汽车用宝马轮子");
	}

}

3、创建获取发动机对象和轮子对象的抽象工厂

AbstractFactory.java

/**
 * 抽象工厂的接口,声明创建抽象产品对象的操作
 */
public interface AbstractFactory {
	
	/**
	 * 创建发动机对象
	 * @return
	 */
	public Engine createEngine();
	/**
	 * 创建轮子对象
	 * @return
	 */
	public Wheel createWheel();
}

4、创建实现了抽象工厂的子工厂:奔驰工厂和宝马工厂

/**
 * 奔驰工厂,生产奔驰发动机和轮子
 */
public class BenFactory implements AbstractFactory {

	@Override
	public Engine createEngine() {
		return new BenEngine();
	}

	@Override
	public Wheel createWheel() {
		return new BenWheel();
	}

}
/**
 * 宝马工厂,生产宝马发动机和轮子
 */
public class BmFactory implements AbstractFactory {

	@Override
	public Engine createEngine() {
		return new BmEngine();
	}

	@Override
	public Wheel createWheel() {
		return new BmWheel();
	}

}

5、汽车组装的时候,就可以这样用:

public class Car {

	public static void main(String[] args) {
		
		// 使用奔驰工厂
		AbstractFactory af = new BenFactory();
		
		Mouse m = af.createMouse();
		Keyboard kb = af.createKeyboard();
		
		m.start(); // 使用奔驰发动机启动
		kb.turn(); // 使用奔驰轮子
		
		
		// 更换为宝马工厂
		af = new BmFactory();
		
		m = af.createMouse();
		kb = af.createKeyboard();
		
		m.start(); // 使用宝马发动机启动
		kb.turn(); // 使用宝马轮子
		
	}
}

应用场景

  • 我们通常看到的网站或软件,支持更换界面主题或者一键换肤。
  • 当系统要支持多数据源,DAO层支持多种类型的数据库,动态切换时。

以上,是个人总结的抽象工厂模式知识点,仅供参考,有不同看法,可以评论区交流。

我是一名码龄10年的程序员,在这里会分享实在干货,让你少走弯路,成就精彩人生。

Java免费学习   Java自学网 http://www.javalearns.com

关注微信号:javalearns   随时随地学Java

或扫一扫

随时随地学Java

作者:不详 来源:网络
    你是从哪里知道本网站的?
  • 网友介绍的
  • 百度搜索的
  • Google搜索的
  • 其它搜索过来的
  • 网址输错了进来的
  • 太忙了不记得了
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • java学习网(www.javalearns.com) © 2014 版权所有 All Rights Reserved.
  • Email:javalearns@163.com 站长QQ:1356121699 晋ICP备14003680号-3
  • java学习网部分内容来自网络或网友发布,如侵犯了您利益,请发邮件至:javalearns@126.com,我们尽快处理!
  • Java学习网
  • 网站统计
  • 晋公网安备 14042902000001号