文档章节

设计模式-抽象工厂模式

 木本本
发布于 10/10 22:35
字数 738
阅读 28
收藏 0

抽象工厂模式

定义

为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类
可以把此类工厂比做一个有多个生产线的车间,生产线产出的产品有相似的约束或者依赖的关系,
比如:我要生产汽车就需要同时生产汽车对应型号的钥匙
uml

优点

· 封装性

  高层模块不关心产品的实现,只关心抽象,接口,
  具体的工厂类负责创建对象,而不必知道内部产品的关联,以及依赖关系的实现,只需要知道工厂类即可生成一个对象

· 产品族内的约束为非公开状态

 对封装性的一个补充,封装内部约束,避免每次高层调用时都去理解内部约束的实现,也是对内部对内部约束的一个保护

· 横向扩展容易

  在上面UML的基础上我需要增加一个3系列,只需要能加3系列的产品A-3和产品B-3,并增加产品3系列的工厂Product3Factory即可完成扩展

缺点

· 产品族的扩展非常困难,即垂直扩展困难,比如说在上面UML的实现的基础上增加一个额外的产品C,我就需要修改AbstractFactory以及所有它的实现,这完全不符合开闭原则。

使用场景

一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式

实现

  • Bmw汽车和汽车钥匙 都受汽车系列约束
public abstract class AbstractBmwXCar {

	public abstract void getPrice();
}

public abstract class AbstractBwmXCarKey {

	public abstract void openCar() ;

}

  • 产品实现
public class BwmX5 extends AbstractBmwXCar {
	@Override
	public void getPrice() {
		System.out.println("我是X5 我要150W");
	}
}
public class BwmX6 extends AbstractBmwXCar {
	@Override
	public void getPrice() {
		System.out.println("我是X6,我要180W");
	}
}
public class X5KeyBwmX extends AbstractBwmXCarKey {

	@Override
	public void openCar() {
		System.out.println("我能打开X5的车门");
	}
}

public class X6KeyBwmX extends AbstractBwmXCarKey {
	@Override
	public void openCar() {
		System.out.println("我能打开X6的车门");
	}
}

  • 抽象工厂
public  abstract  class AbstractCarFactory {

	public abstract AbstractBmwXCar createCar();

	public abstract AbstractBwmXCarKey createKey();

}

  • 工厂实现
public class X5Factory extends AbstractCarFactory {
	@Override
	public BwmX5 createCar() {
		BwmX5 bwmX5 = new BwmX5();
		return bwmX5;
	}

	@Override
	public X5KeyBwmX createKey() {
		X5KeyBwmX x5Key = new X5KeyBwmX();
		return x5Key;
	}
}
public class X6Factory extends AbstractCarFactory {

	@Override
	public BwmX6 createCar() {
		BwmX6 bwmX6 = new BwmX6();
		return bwmX6;
	}

	@Override
	public X6KeyBwmX createKey() {
		X6KeyBwmX x6Key = new X6KeyBwmX();
		return x6Key;
	}
}

  • 客户端调用

public class BmwCeo {

	public static void main(String[] args) {

		X5Factory x5Factory = new X5Factory();

		X6Factory x6Factory = new X6Factory();

		BwmX5 x5_1 = x5Factory.createCar();
		X5KeyBwmX x5Key = x5Factory.createKey();


		BwmX6 x6_1 = x6Factory.createCar();
		X6KeyBwmX x6Key = x6Factory.createKey();

		// 下面可以做自己的处理了

	}
}

扩展

© 著作权归作者所有

粉丝 1
博文 8
码字总数 5992
作品 0
东城
私信 提问
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
Java经典设计模式-结构型模式-适配器模式(Adapter)

适配器模式 适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的...

Idea
2018/01/20
127
0
设计模式之抽象工厂模式(创建型)

模式定义 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。 模式角色 抽象...

smileNicky
01/01
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
286
2
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js—String的一些方法

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> var str="Hello boy" /** * 在底......

zhengzhixiang
13分钟前
3
0
vSphere ESXi 主机上的3种VLAN设置

VLAN - Virtual Local Area Network,虚拟局域网,能便捷地组建一个网络分组,并能提供诸多好处。VMware vSphere ESXi主机上,也可以在个层次上通过设置VLAN标签地形式来组建VLAN。从划分的层...

大别阿郎
35分钟前
4
0
elasticsearch 6.x的基本dsl语句

本文使用的谷歌浏览器插件sense,链接如下sense插件(兼容es6.x版本) 查看集群状态 http://106.12.27.130:9200/_cat/health?v 绿色-一切都很好(集群功能齐全) 黄色——所有的数据都是可用...

长恭
49分钟前
12
0
移动端的弹窗滚动禁止body滚动

本文转载于:专业的前端网站➼移动端的弹窗滚动禁止body滚动 前言 最近一个需求是弹窗展示列表,显然是需要一个滚动条的,而滚动到底部就会穿透到body滚动,而阻止默认行为是不行的,这样两个...

前端老手
今天
18
0
设计模式 建造者模式和模板方法模式扩展篇

建造者模式和模板方法模式扩展篇 UML 与抽象工厂模式比较 本模式可以看出与抽象工厂非常类似,都是产生不同的产品,怎么区分这两种设计的使用场景呢 - 建造者模式关注的是基本方法的调...

木本本
今天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部