Spring框架学习第二节:Java设计模式(四)

此博客用于个人学习,来源于ssm框架的书籍,对知识点进行一个整理。

2.4 工厂模式和抽象工厂模式

不再用new的方式创建对象,定义一个类似于工厂的模块,根据客户的需求找到对应的工厂是生产所需的产品。特别是对于客户而言,工厂只是一个抽象概念,他只是大概知道有这样一个工厂能满足他的需要。

2.4.1 普通工厂(Simple Factory)模式

下图为产品工厂模式的图示:
在这里插入图片描述
由上图可知,有个 IProduct 的接口,它下面有5个实现类 Product1、Product2、Product3、Product4、Product5。它们属于一个大类,可以通过一个工厂去管理它们的生成,但是由于类型不同,所以初始化有所不同。为了方便管理,使用产品工厂类(ProductFactory)来创建这些产品的对象,用户可以通过产品的某些特性来确定需要什么产品,比如产品号,我们可以看一下 ProductFactory 的伪代码:

public class ProductFactory{
	public static IProduct createProduct(String productNo){
		switch(productNo){
			case "1": return new Product1(xxxx);
			case "2": return new Product2(xxxx);
			case "3": return new Product3(xxxx);
			case "4": return new Product4(xxxx);
			case "5": return new Product5(xxxx);
			default : throw new NotSupportedException("未支持此编号产品生产");
		}
	}
}

对于程序调用者而言,只需要知道通过工厂的 createProduct 方法,指定产品编号—— productNo 可以得到对应的产品,而产品满足接口 IProduct 的规范,所以初始化就简单了许多。

2.4.2 抽象工厂(Abstract Factory)模式

对于普通工厂而言,它解决了一类对象创建的问题,但是有的时候对象很复杂,可能有几十种,又分为几个类别。如果只有一个工厂,面对如此多的产品,这个工厂需要实现的逻辑就太复杂了,所以我们希望把工厂分成好几个,便于维护工厂的产品规则。但是,对于调用者来说,只需要知道有一个统一的工厂即可。
在这里插入图片描述
客户只是认为有一个能够生产各类产品的工厂,它能生产我所需要的产品,这里工厂只是一个虚拟的概念,并不真实存在,它其实是各个分厂去实现的,这个虚拟工厂被称为抽象工厂,它的各个分厂被称为具体工厂。需要指定一个接口规范(IProductFactory),所有的具体工厂和抽象工厂都要实现这个接口。

public interface IProductFactory{
	public IProduct createProduct(String productNo);
}

这里的方法 createProduct 是每一个工厂都要去实现的,包括抽象工厂和具体工厂。

public class ProductFactory1 implements IProductFactory{
	public IProduct createProduct(String productNo){
		IProduct product = xxxx;//工厂1生产产品的规则,可以是一类产品的规则
		return product;
	}
}

public class ProductFactory2 implements IProductFactory{
	public IProduct createProduct(String productNo){
		IProduct product = xxxx;//工厂2生产产品的规则,可以是一类产品的规则
		return product;
	}
}

public class ProductFactory3 implements IProductFactory{
	public IProduct createProduct(String productNo){
		IProduct product = xxxx;//工厂3生产产品的规则,可以是一类产品的规则
		return product;
	}
}

这个时候,我们需要定义一个抽象工厂(ProductFactory)来管理上面三个具体工厂,需要定义一些产品规则,比如编号是1开头的就用工厂1创建对象。

public class ProductFactory implements IProductFactory{
	public static IProduct createProduct(String productNo){
		char ch = productNo.charAt(0);
		IProductFactory factory = null;
		if(ch == '1'){
			factory = new ProductFactory1();
		}else if(ch == '2'){
			factory = new ProductFactory2();
		}else if(ch == '3'){
			factory = new ProductFactory3();
		}
		if(factory != null){
			return factory.createProduct(productNo);
		}
		return null;
	}
}

这样就可以通过产品编号来创建产品的对象,创建对象对调用者来说就简单了许多,每一个工厂也只要维护其类型产品对象的生产,具体的工厂规则也不会特别复杂,难以维护。

猜你喜欢

转载自blog.csdn.net/paynmind/article/details/106785898