无论是简单工厂模式,还是抽象工厂模式,都属于工厂模式,在形式和特点上很相近,他们的最终目的都是为了解耦。
为了方便理解,看此篇之前请先理解简单模式,可以阅读我前面写过的文章——简单工厂模式。
了解完简单工厂模式你会发现:
(1)多个具体产品类都衍生自同一个接口或抽象类。
(2)一个抽象工厂类,可以派生出多个具体工厂类。
(3)并且每个具体工厂类只能创建一个具体产品类的实例。
而抽象工厂模式是上述模式的升级版:
(1)多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
(2)一个抽象工厂类,可以派生出多个具体工厂类。(同简单工厂模式)
(3)并且每个具体工厂类可以创建多个具体产品类的实例。(看了后面的例子自然会懂)
1.抽象工厂模式模式介绍
抽象工厂模式定义:
为创建一组相关或者是相互依赖的对象提供的一个接口,而不需要指定它们的具体类。
这个定义很抽象,不急,可以看完实例再返回来看一遍。
抽象工厂模式包括的角色:
(1)抽象产品类:为各种产品声明抽象接口或抽象类。
(2)具体产品类:抽象产品类的实现类,为实现某个具体产品的对象。
(3)抽象工厂类:声明了一组(注意是一组,看了下面的例子就会明白和工厂方法模式的区别)用于创建一种产品(每一个方法对应一种产品)的方法。
(4)具体工厂类:继承抽象工厂类,生成一组具体产品(注意是一组,这很重要)。
2. 抽象工厂模式的实现
下面是利用简单工厂模式“生产两款打印机”的实例介绍,便于理解该模式如何运用。
在本例中,有两款硒鼓品牌,分别为新北洋和鼎龙股份。也有两种墨盒品牌,分别为爱普生和惠普。
(这就是一开始所说的,抽象工厂模式有多个产品抽象类,分别为硒鼓抽象类和墨盒抽象类)
为了方便理解,看此篇之前请先理解简单模式,可以阅读我前面写过的文章——简单工厂模式。
了解完简单工厂模式你会发现:
(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类型的打印机的组件换了,客户端就要做更改!