很长时间对简单工厂、工厂模式傻傻分不清楚,故写此文章希望能加深理解,其中涉及的代码和图均来自
先思考几个问题
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!");
}
}
到此,手机生产流程完毕。
我们来回答下开篇文章的两个问题
(四)简单工厂和工厂的区别:
优点:简单、方便、容易添加新类,缺点:新加实现类可能导致出错,耦合度高,维护性较差。
2、工厂优点:对工厂进行了拆分,容易添加新类,耦合度低,缺点:代码稍微庞大,不易维护。
(五)简单工厂和工厂是否可以转换?
这个要根据你真正的业务需求来定,个人建议,如果不超过3个用简单工厂,否则最好用工厂模式,避免未来杯具。
以上是我对简单工厂、工厂模式的理解,有不同理解可以评论区探讨
附