我理解的设计模式-简单工厂、工厂模式

很长时间对简单工厂、工厂模式傻傻分不清楚,故写此文章希望能加深理解,其中涉及的代码和图均来自:https://www.cnblogs.com/yssjun/p/11102162.html

先思考几个问题

1、简单工厂和工厂区别是什么?

2、简单工厂和工厂可以相互转换吗?

带着这2个问题,我们以生产小米、苹果手机为例,来分析手机是如何生产的

(一)假设我们已经拿到了小米、苹果两台手机生产方案(具体实现类),可以看出生产手机需要建工厂或厂房

//简单工厂的具体实现
public class Demo {
    public static void main(String[] arg) {
        //实例化手机工厂类
        PhoneFactory factory = new PhoneFactory();
        //生产小米手机
        Phone miPhone = factory.makePhone("MiPhone");        
        //生产苹果手机    
        IPhone iPhone = (IPhone)factory.makePhone("iPhone"); 
    }
}
//工厂类具体实现
public class Demo {
    public static void main(String[] arg) {
        //实例小米工厂类
        AbstractFactory miFactory = new XiaoMiFactory();
        //实例苹果工厂类
        AbstractFactory appleFactory = new AppleFactory();
        //生产小米手机
        miFactory.makePhone();     
        //生产苹果手机       
        appleFactory.makePhone();        
    }
}

乍看代码是不是心理一句,卧槽,写法没什么不同。简单工厂无非是传递(MiPhone,IPhone)e)俩参数生产两次,工厂模式分别实例这两个类,也需要生产两次,说起来简单工厂还少一次实例化呢(思考下为什么还会有工厂模式)。

别着急,咱们继续分析手机生产流程,既然有了生产方案,我们可以把自己想象成土豪,要生产手机该怎样先把工厂建起来?

(二)建厂、规划流水线

土豪也分:大豪、小豪。

假设小豪建立的是个小厂(简单工厂),订单来了就要切换流水线。(无建厂规范典型的暴发户心理)

//小厂房加工手机,根据订单类型切换流水线,好累呦!
public class PhoneFactory {
    
    public Phone makePhone(String phoneType) {
        //来了小米手机订单,就切到小米流水线
        if(phoneType.equalsIgnoreCase("MiPhone")){
            return new MiPhone();
        }
        
        //来了苹果手机订单,就切到苹果流水线
        if(phoneType.equalsIgnoreCase("iPhone")) {
            return new IPhone();
        }
        return null;
    }
}

假设大豪创建大厂房(工厂)

1、遵守建厂规则,规范化建厂

//建厂的规范,只能生产手机
public interface AbstractFactory {
    Phone makePhone();
}

2、按照生产手机工厂规定创建小米手机加工厂

//小米手机加工厂,必须遵循手机工厂的规范守则
public class XiaoMiFactory implements AbstractFactory{
    @Override
    public Phone makePhone() {
        return new MiPhone();
    }
}

3、按照生产手机工厂规定创建苹果手机加工厂

//苹果手机加工厂,必须遵循手机工厂的规范守则
public class AppleFactory implements AbstractFactory {
    @Override
    public Phone makePhone() {
        return new IPhone();
    }
}

至此凭财力建厂完毕,大厂小厂有订单能生产手机就是好厂。接下来我们要考虑生产手机了。

(三)是时候生产手机了

生产手机不是儿戏,要遵守标准,否则出厂检验不合格,无法出售。大豪、小豪还不哭死?

(1)手机生产规范

//规范
public interface Phone {
    void sms();
    void chat();
    void call();
}

(2)生产小米手机

//生产小米
public class MiPhone implements Phone {
    public MiPhone() {
        this.call();
        this.chat();
        this.sms();
    }
    @Override
    public void call() {
        // TODO Auto-generated method stub
        System.out.println("make xiaomi phone!");
    }
    @Override
    public void chat() {
        // TODO Auto-generated method stub
        System.out.println("make xiaomi phone!");
    }
    @Override
    public void sms() {
        // TODO Auto-generated method stub
        System.out.println("make xiaomi phone!");
    }
}

(3)生产苹果手机

//生产小米
public class IPhone implements Phone {
    public MiPhone() {
        this.call();
        this.chat();
        this.sms();
    }
    @Override
    public void call() {
        // TODO Auto-generated method stub
        System.out.println("make xiaomi phone!");
    }
    @Override
    public void chat() {
        // TODO Auto-generated method stub
        System.out.println("make xiaomi phone!");
    }
    @Override
    public void sms() {
        // TODO Auto-generated method stub
        System.out.println("make xiaomi phone!");
    }
}

到此,手机生产流程完毕。

我们来回答下开篇文章的两个问题

(四)简单工厂和工厂的区别:

           1、简单工厂优点:简单、方便、容易添加新类,缺点:新加实现类可能导致出错,耦合度高,维护性较差

           2、工厂优点:对工厂进行了拆分,容易添加新类,耦合度低,缺点:代码稍微庞大,不易维护。

(五)简单工厂和工厂是否可以转换?

          这个要根据你真正的业务需求来定,个人建议,如果不超过3个用简单工厂,否则最好用工厂模式,避免未来杯具。

以上是我对简单工厂、工厂模式的理解,有不同理解可以评论区探讨

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值