【个人记录】工厂模式几种实现的区别及优缺点

工厂模式的实现及优缺点简单记录:

1、简单工厂模式

定义一个工厂类,定义静态的getIBeanName() 方法根据参数的不同返回不同类的实例对象,被创建的实例都具有共同的父类;

BizPisa GreekPisa CheesePisa

class SimpleFactory{ 
	public static BizPisa createPisa(String name){ 
		return PisaEnum.valueOf(name).bizpisa;
	}
	private enum PisaEnum{ 
		 GreekPisa(new GreekPisa()),
		 CheesePisa(new CheesePisa());
		 public BizPisa bizPisa;
		 PisaEnum(BizPisa bizPisa) { 
		 	this.bizPisa = bizPisa;	
		 }
	}
}

优点:使用者只需要提供参数就可以取得实例对象,对象实例化的任务交给工厂内部实现;
缺点:违背开闭原则,每次添加新的产品都需要修改内部实例化逻辑

2、工厂方法模式:

将简单工厂模式的工厂类抽象,将创建实例化对象的发放变成抽象方法,即抽象类只提供抽象方法,交给子类去创建具体的实例对象

BizPisa GreekPisa CheesePisa «Abstract» BizPisaFactory createPisa() : BizPisa GreekPisaFactory createPisa() : GreekPisa CheesePisaFactory createPisa() : CheesePisa

abstract class BizPisaFactory{ 
	public abstract BizPisa createPisa();
}
class CheesePisaFactory extends BizPisaFactory { 
	public BizPisa createPisa(){ 
		return new CheesePisa();
	}
}
class GreekPisaFactory extends BizPisaFactory { 
	public BizPisa createPisa(){ 
		return new GreekPisa();
	}
}

优点:扩展性较简单工厂模式强,避免了简单工厂模式创建对象的需要编写的复杂逻辑(此处指条件控制语句,枚举除外
缺点:每增加一个新的产品时,都要增加具体的产品类及该产品对应的工厂对象,类个数成倍增加,增加了类之间的依赖。

3、抽象工厂模式:

工厂方法模式单个工厂只能生产单个商品,新增产品只能新增工厂类,为了避免出现产品过多导致工厂类过多的问题,将工厂方法模式优化,单个工厂可以实例化多种产品

BizPisa GreekPisa CheesePisa BizCake GreekCake CheeseCake «Interface» BizPisaFactory createPisa() : BizPisa createPisa() : BizCake GreekFactory createPisa() : GreekPisa createCake() : GreekCake CheeseFactory createPisa() : CheesePisa createCake() : CheeseCake

interface BizFactory{ 
	BizPisa createPisa();
	BizCake createCake();
}
class CheeseFactory implements BizFactory{ 
	public BizPisa createPisa(){ 
		return new CheesePisa();
	}
	public BizPisa createPisa(){ 
		return new CheesePisa();
	}
}
class GreekFactory implements BizFactory{ 
	public BizCake createPisa(){ 
		return new GreekPisa();
	}
	public BizCake createCake(){ 
		return new GreekCake();
	}
}

当然,上述代码也能以简单工厂模式传参的形式获取到工厂对象和产品,具体看自己的写法。
优点:增加新的具体工厂和产品族很方便,无须修改已有系统,减少类的创建,符合“开闭原则”。
缺点:产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。

上述代码只做简单演示,想深入了解工厂模式的使用可以参考各类源码,以上仅代表个人理解,有问题欢迎留言讨论。

    原文作者:ykx____h
    原文地址: https://blog.csdn.net/ykx____h/article/details/114919833
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞