博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式04_抽象工厂模式
阅读量:6869 次
发布时间:2019-06-26

本文共 2540 字,大约阅读时间需要 8 分钟。

本文是在学习中的总结,欢迎转载但请注明出处:

抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广。

抽象工厂模式与工厂方法模式的最大差别就在于工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则须要面对多个产品等级结构。

如果一个子系统须要一些产品对象,而这些产品又属于一个以上的产品等级结构。

那么为了将消费这些产品对象的责任和创建这些产品对象的责任切割开来。能够引进抽象工厂模式。

这种话。消费产品的一方不须要直接參与产品的创建工作,而仅仅须要向一个公用的工厂接口请求所须要的产品。

长处:

(1)分离接口和实现

client使用抽象工厂来创建须要的对象,而client根本就不知道详细的实现是谁,client仅仅是面向产品的接口编程而已。也就是说,client从详细的产品实现中解耦。
(2)使切换产品族变得easy
由于一个详细的工厂实现代表的是一个产品族,比方上面样例的从A产品到B产品仅仅须要切换一下详细工厂。

缺点:
(1)不太easy扩展新的产品
假设须要给整个产品族加入一个新的产品,那么就须要改动抽象工厂,这样就会导致改动全部的工厂实现类。

通过以下代码来熟悉抽象工厂模式:

不同的抽象工厂:

package com.design.abstractFactory;//每一种牌子的产品负责生产工厂。即不同的厂商负责自己牌子的生产public abstract class Factory1 {	abstract public IproductA getproductA1();	abstract public IproductB getProductB1();}
package com.design.abstractFactory;public abstract class Factory2 {	abstract public IproductA getproductA2();	abstract public IproductB getproductB2();}

不同的详细工厂:

package com.design.abstractFactory;//详细的工厂生产产品public class ConcreateFactory1 extends Factory1 {	@Override	public IproductA getproductA1() {		return new ProductA1();	}	@Override	public IproductB getProductB1() {		return new ProductB1();	}}
package com.design.abstractFactory;public class ConcreateFactory2  extends Factory2{	@Override	public IproductA getproductA2() {		return new ProductA2();	}	@Override	public IproductB getproductB2() {		return new ProductB2();	}}

定义不同的产品接口:

package com.design.abstractFactory;//定义不同的产品之间的一定具备的标准,用interface实现 public interface IproductA {	public void method();}
package com.design.abstractFactory;public interface IproductB {	public void method();}

不同的详细产品:

package com.design.abstractFactory;//实现了产品标准实现的一系列详细产品public class ProductA1 implements IproductA {	@Override	public void method() {		System.err.println("A1产品生产A1");	}}
package com.design.abstractFactory;public class ProductA2 implements IproductA {	@Override	public void method() {		System.err.println("A2生产产品A2");	}}

package com.design.abstractFactory;public class ProductB1 implements IproductB {	@Override	public void method() {		System.err.println("B1生产产品B1");	}}
package com.design.abstractFactory;public class ProductB2 implements IproductB {	@Override	public void method() {		System.err.println("B2生产产品B2");	}}

client实现:

package com.design.abstractFactory;public class Client {	public static void main(String[] args) {		Factory1 factory = new ConcreateFactory1();		IproductA a1 = factory.getproductA1();		IproductB b1 = factory.getProductB1();		a1.method();		b1.method();	}}

測试结果:

A1产品生产A1
B1生产产品B1

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5090638.html,如需转载请自行联系原作者

你可能感兴趣的文章
工作中遇到的懒加载问题
查看>>
lbp纹理特征
查看>>
elastic的gc相关
查看>>
perl学习(3)正则表达式
查看>>
案例分析:免费的维护服务
查看>>
HDU_2152 Fruit(生成函数)
查看>>
css关于定位那些事情
查看>>
WCF IIS上部署服务
查看>>
微软职位内部推荐-Software Development Engineering II
查看>>
Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK
查看>>
mariadb 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
查看>>
面向.Net程序员的后端性能优化实战
查看>>
基于CSS3 3D百叶窗图像过渡特效
查看>>
PIC16F877A 资料大全/PDF/ADC/CCP/PWM/UART
查看>>
对Asp.net Mvc 和 jQuery UI使用者的一些忠告
查看>>
mdev的基本工作原理
查看>>
深入理解HTTP协议
查看>>
Gson简要使用笔记
查看>>
一些简单的算法
查看>>
flex 控件数据源绑定
查看>>