1、简单工厂模式
定义一个工厂类,定义静态的getIBeanName() 方法根据参数的不同返回不同类的实例对象,被创建的实例都具有共同的父类;
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、工厂方法模式:
将简单工厂模式的工厂类抽象,将创建实例化对象的发放变成抽象方法,即抽象类只提供抽象方法,交给子类去创建具体的实例对象
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、抽象工厂模式:
工厂方法模式单个工厂只能生产单个商品,新增产品只能新增工厂类,为了避免出现产品过多导致工厂类过多的问题,将工厂方法模式优化,单个工厂可以实例化多种产品
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();
}
}
当然,上述代码也能以简单工厂模式传参的形式获取到工厂对象和产品,具体看自己的写法。
优点:增加新的具体工厂和产品族很方便,无须修改已有系统,减少类的创建,符合“开闭原则”。
缺点:产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。
上述代码只做简单演示,想深入了解工厂模式的使用可以参考各类源码,以上仅代表个人理解,有问题欢迎留言讨论。