Java 设计模式之工厂模式

简单工厂:

interface IPeople{}
public class Man implements IPeople{}
public class Woman implements IPeople{}
public class PeopleFactory1{
    private IPeople p;
    public static IPeople createWoman(){
        return new Woman();
    }
    public static IPeople createMan(){
        return Man();
    }
}
//或者通过参数来判断是否传出来的对象
public class PeopleFactory2{
    public static IPeople createPeople(String args){
        IPeople p = null;
        switch(args){
            case "man":
                p = new Man();
                break;
            case "woman":
                p = new Woman();
                break;
        }
        return p;
    }
}

有人说初级工程师的工作就是ctrl+c和ctrl+v,这并不是一个好的习惯,这说明你的代码有好多重复的地方,那么以后维护的时候就是灾难。这就是为什么好的代码是不断优化,而好的设计就是总结出来的设计模式。
工厂方法:

interface IPeopleFactory{ 
    People createPeople();
}
public class ManFactory implements IPeopleFactory{
    public People createPeople(){
        return new Man();
    }
}
public class WomanFactory implements IPeopleFactory{
    public People createPeople(){
        return new Woman();
    }
}

但是工厂方法依然有问题没有解决,就上面的例子,如果要给工厂接口添加一个创建外星生物方法。
抽象工厂方法

interface IFactory{
    People createPeople();
    WaiXingRen createWaiXingRen();
}
public class ManFactory implements IPeopleFactory{
    public People createPeople(){
        return new Man();
    }
    public IWaiXinRen createWaiXingRen(){
        return new WaiWan();
    }
}
public class WomanFactory implements IPeopleFactory{
    public People createPeople(){
        return new Woman();
    }
    public IWaiXingRen createWaiXingRen(){
        return new WaiWoman();
    }
}
//另外还有要添加IWaiXingRen 接口和男外星人和女外星人实现,就不写了

是不是要在添加更多的类,还要修改工厂接口和实现。如果需求变成这样不如还写成简单工厂的方式,如下:
简单工厂改进抽象工厂方法

public class Factory{
    //参数可以提出去,做成全局配置,也可以通过配置文件载入
    public static IPeople createPeople(String args){
        IPeople p = null;
        switch(args){
            case "man":
                p = new Man();
                break;
            case "woman":
                p = new Woman();
                break;
        }
        return p;
    }
    public static IWaiXingRen createWaiXingRen(String args){
        IWaiXingRen w = null;
        switch(args){
            case "man":
                w = new WaiMan();
                break;
            case "woman":
                w = new WaiWoman();
                break;
        }
        return w;
    }
}

总结:
工厂方法与简单工厂的区别就是工厂职责单一,这就实现了对扩展开放的原则,如果添加需求不用区修改原有工厂的方法,但是如果需求需要变更工厂里的内容,则还是需要简单工厂来构造更方便。工厂方法是简单工厂的进一步抽象和推广。而简单工厂是抽象工厂方法的浓缩。
另外可以利用反射可以避免分支判断的问题。
perfact

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值