抽象工厂模式

无论是简单工厂模式,还是抽象工厂模式,都属于工厂模式,在形式和特点上很相近,他们的最终目的都是为了解耦。
为了方便理解,看此篇之前请先理解简单模式,可以阅读我前面写过的文章——简单工厂模式。

了解完简单工厂模式你会发现:
(1)多个具体产品类都衍生自同一个接口或抽象类。
(2)一个抽象工厂类,可以派生出多个具体工厂类。
(3)并且每个具体工厂类只能创建一个具体产品类的实例。

而抽象工厂模式是上述模式的升级版:
(1)多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
(2)一个抽象工厂类,可以派生出多个具体工厂类。(同简单工厂模式)
(3)并且每个具体工厂类可以创建多个具体产品类的实例。(看了后面的例子自然会懂)

1.抽象工厂模式模式介绍
抽象工厂模式定义:
为创建一组相关或者是相互依赖的对象提供的一个接口,而不需要指定它们的具体类。
这个定义很抽象,不急,可以看完实例再返回来看一遍。

抽象工厂模式包括的角色:
(1)抽象产品类:为各种产品声明抽象接口或抽象类。
(2)具体产品类:抽象产品类的实现类,为实现某个具体产品的对象。
(3)抽象工厂类:声明了一组(注意是一组,看了下面的例子就会明白和工厂方法模式的区别)用于创建一种产品(每一个方法对应一种产品)的方法。
(4)具体工厂类:继承抽象工厂类,生成一组具体产品(注意是一组,这很重要)。

2. 抽象工厂模式的实现
下面是利用简单工厂模式“生产两款打印机”的实例介绍,便于理解该模式如何运用。
在本例中,有两款硒鼓品牌,分别为新北洋和鼎龙股份。也有两种墨盒品牌,分别为爱普生和惠普。
(这就是一开始所说的,抽象工厂模式有多个产品抽象类,分别为硒鼓抽象类和墨盒抽象类)

然后在本例中,对于A类打印机,搭载的是新北洋硒鼓和爱普生墨盒。对于B类打印机,搭载的是鼎龙硒鼓和惠普墨盒。

1.  具体部件的接口和实现类

(1)  墨盒接口

package com.wx.parttern;

//墨盒接口
public interface IBox {
	void doWork();
}

爱普生墨盒

package com.wx.parttern;

//爱普生墨盒
public class EpsonBox implements IBox{
	public void doWork() {
		System.out.println("爱普生墨盒 is working");
	}
}

惠普墨盒

package com.wx.parttern;

//惠普墨盒
public class HPBox implements IBox{
	public void doWork() {
		System.out.println("惠普墨盒 is working");
	}
}

(2)  硒鼓接口

package com.wx.parttern;

//硒鼓接口
public interface IXiGu {
	void show();
}

北洋硒鼓

package com.wx.parttern;

//北洋硒鼓
public class BeiYangXi implements IXiGu{
	public void show() {
		System.out.println("北洋硒鼓is working");
	}
}

鼎龙硒鼓

package com.wx.parttern;

//鼎龙硒鼓
public class DingLongXi implements IXiGu{
	public void show() {
		System.out.println("鼎龙硒鼓is working");
	}
}

2.  打印机抽象类及实现

//打印机抽象类
public abstract class AbstractPrinter {
	//获得墨盒对象
	public abstract IBox getBox();
	
	//获得硒鼓对象
	public abstract IXiGu getXiGu();
}

A型打印机工厂类

package com.wx.parttern;

//A型打印机
public class PrinterTypeA extends AbstractPrinter{
	//爱普生的墨盒
	public IBox getBox() {
		return new EpsonBox();
	}
	
	//新北洋的硒鼓
	public IXiGu getXiGu() {
		return new BeiYangXi();
	}
}

B型打印机工厂类

package com.wx.parttern;

//B型打印机
public class PrinterTypeB extends AbstractPrinter{
	//惠普的墨盒
	public IBox getBox() {
		return new HPBox();
	}
	
	//鼎龙的硒鼓
	public IXiGu getXiGu() {
		return new DingLongXi();
	}
	
	
}

3.  测试

package com.wx.parttern;
//客户端client
public class TestFactory {
	public static void main(String[] args) {
		AbstractPrinter printerA=new PrinterTypeA();
		printerA.getXiGu().show();
		printerA.getBox().doWork();
	}
}

好处就是客户端和组件的具体实现类进行了解耦:当我们A类型的打印机的组件换了,客户端不用变动,只要改A型打印机工厂类即可!!!!

对比传统方式

package com.wx.parttern;

public class TestFacroty2 {
	public static void main(String[] args) {
		//A型打印机
		IBox box=new EpsonBox();
		IXiGu xigu=new BeiYangXi();
		xigu.show();
		box.doWork();
	}
}

当我们A类型的打印机的组件换了,客户端就要做更改!









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御前两把刀刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值