设计模式之禅学习之抽象工厂模式
1、抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。工厂方法模式中的工厂生产的往往都是同一级别的产品(比如生产的就是人);而抽象工厂模式的工厂生产的产品是分等级的(比如生产的是男人和女人,虽然都是人,但是是多品种)。用抽象工厂模式是一般都是多业务品种,多业务分类,会有多个工厂实现类,来生产不用业务品种。
2、产品类的等级,也就是产品是分种类的:
下面用代码实现上图中的产品分类逻辑:
首先定义最上面的产品接口:
package com.wang.factoryPattern.abstractF;
/**
* 产品接口定义
* @author HeJW
*
*/
public interface IProduct {
//每个产品共有的方法
public void shareMethod();
//每个产品相同的方法,不同的实现
public abstract void doSomething();
}
然后是抽象产品的分类:
package com.wang.factoryPattern.abstractF;
public class Product1Factory implements IProductFactory {
@Override
public AbstractProductA productAFactory() {
return new ProductA1();
}
@Override
public AbstractProductB productBFactory() {
return new ProductB1();
}
}
这里只给出了一种分类,实际项目中应该是多中的,我们可以在定义多个实现,
在往下就是具体的产品类的。只要分别实现抽象产品就可以了。一下是一个例子:
package com.wang.factoryPattern.abstractF;
public class ProductA1 extends AbstractProductA {
@Override
public void doSomething() {
System.out.println("产品A的第1个实现");
}
}
3、创建工厂。创建工厂接口时,应该按产品的分类,分别定义生产这种产品的工厂方法:
package com.wang.factoryPattern.abstractF;
/**
* 抽象工厂定义
* @author HeJW
*
*/
public interface IProductFactory {
//A系类产品工厂
public AbstractProductA productAFactory();
//B系类产品工厂
public AbstractProductB productBFactory();
}
实现该工厂接口时,分别实现产品实例即可,以下是一个工厂实现的例子:
package com.wang.factoryPattern.abstractF;
public class Product1Factory implements IProductFactory {
@Override
public AbstractProductA productAFactory() {
return new ProductA1();
}
@Override
public AbstractProductB productBFactory() {
return new ProductB1();
}
}
4、编写一个场景类:
package com.wang.factoryPattern.abstractF;
public class App {
public static void main(String[] args) {
IProductFactory factory1 = new Product1Factory();
IProductFactory factory2 = new Product2Factory();
AbstractProductA pa1 = factory1.productAFactory();
pa1.doSomething();
AbstractProductA pa2 = factory2.productAFactory();
pa2.doSomething();
AbstractProductB pb1 = factory1.productBFactory();
pb1.doSomething();
AbstractProductB pb2 = factory2.productBFactory();
pb2.doSomething();
}
}
附上工程代码,欢迎下载