设计模式之一工厂模式

注:文章参考来自《设计模式》一书和维基百科

1.工厂模式定义

定义:定义一个用于创建对象的接口或抽象类,让子类决定实例化哪一个类,工厂方法使一个类实例化延迟其子类。

类型:创建类模式

类图:

 

类图分析:

从类图中可以看出共有四个参与者。

  • IFactory(工厂接口):工厂接口是工厂模式的核心,调用者通过工厂接口来产生产品,在实际情况中也可能是个抽象类。工厂接口依赖于它的子类来定义工厂方法,它的根据需求返回一个适当的产品。
  • ConcreteFactory(工厂实现):工厂实现决定了产品实现的过程。有多少种产品,就有多少个具体的工厂实现。
  • IProduct(产品接口):定义工厂方法所创建对象的接口,实际情况中也可能是个抽象类。产品接口主要为了定义产品实现规范,所有产品实现都必须遵守产品接口定义的规范。
  • ConcreteProduct(产品实现):产品的具体实现,决定了具体产品的具体行为,一般有多个具体实现类。

工厂模式根据抽象程度分为三种:简单工厂模式,工厂模式,抽象工厂模式。简单工厂方法与工厂方法极为相似,它没有工厂接口,可以作为工厂模式的简化版,这里不做详细解释。

2.工厂模式具体代码

//产品接口,实际情况中,大部分情况下是抽象类
interface IProduct{
	public void doSomething();
}
//产品A的具体实现
class ConcreteProductA implements IProduct{
	@Override
	public void doSomething() {
		System.out.println("This is Product A");
	}
}
//产品B的具体实现
class ConcreteProductB implements IProduct{
	@Override
	public void doSomething() {
		System.out.println("This is Product B");
	}
}
//工厂接口,实际情况中,大部分情况下是抽象类
interface IFactory{
	public IProduct createProduct();
}
//生产产品A的工厂的具体实现
class ConcreteFactoryA implements IFactory{
	@Override
	public IProduct createProduct() {
		// TODO Auto-generated method stub
		return new ConcreteProductA();
	}
}
//生产产品B的工厂的具体实现
class ConcreteFactoryB implements IFactory{
	@Override
	public IProduct createProduct() {
		// TODO Auto-generated method stub
		return new ConcreteProductB();
	}
}
public class FactoryPattern {
	public static void main(String[] args){
		IFactory factoryA = new ConcreteFactoryA();
		IFactory factoryB = new ConcreteFactoryB();
		IProduct productA = factoryA.createProduct();
		IProduct productB = factoryB.createProduct();
		
		productA.doSomething();
		productB.doSomething();
	}
}

我看见大部分人使用工厂模式的时候喜欢把所有的生产方式写到同一个工厂里面,这样非常不好,一旦有的新的产品加入就需要改动该工厂,违反了开闭原则,而且一旦产品过多,工厂类就会非常繁冗。

3.工厂模式优点

工厂模式是在编程中常用到的一种模式,它的优点有:

  • 使用工厂模式,在一个类的内部创建对象通常比直接创建对象要更灵活。在编程过程中实例化有时候非常复杂,通过工厂模式,将产品的实例化过程封装起来,使得调用者根本不用关心产品实例化过程,只需要通过工厂得到产品即可。
  • 工厂模式不再将与特定应用相关的类绑定到你的代码中,也就是调用者只需要通过工厂创建产品,不需要关联创建产品过程中需要依赖的类,也不需要关联产品需要的类,这些都在工厂中实现了,达到了降耦的作用。
  • 更方便扩展,因为产品的实例化过程是在工厂中实现的,一旦产品类发生了变化,只需要在工厂中修改代码,不会影响到调用者。

4.工厂模式适用场景

不管是简单工厂模式,工厂模式还是抽象工厂模式,它们都具有类似的特性,所以他们适用的场景也有些类似。

  • 工厂模式作为一种创建类模式,在任何实例化对象比较复杂的地方,都可以使用工厂模式。需要注意的是,如果实例化对象比较简单,不需要为了使用设计模式而使用,特备是通过new就能完成实例化的对象,无需使用工厂模式。
  • 工厂模式可以解耦,也可以提高系统的可扩展性。如果调用者需要自己组装产品,而且产品经常变化,可以使用工厂模式降低耦合,完成产品的组装。

因为工厂模式有很好的解耦作用,可拓展性比较好,所以它在实际中使用较多,大部分都是潜意识就直接使用了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值