`

抽象工厂模式

阅读更多

设计模式之禅学习之抽象工厂模式

 

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();
	}
	
}

 附上工程代码,欢迎下载

  • 大小: 8.7 KB
1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics