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

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


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

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值