文章目录
设计模式——简单工厂模式
1.对工厂模式的理解
同样的一个理论原则,每个人的理解方式不一样,不过有简单法则,尽量让一切都保持简单,所以我尽量用一种简单的方式来理解工厂模式
假设一个很简单的场景:
我们想要生产一部手机,首先得拿到各种原材料,还要再做成各种配件,CPU、屏幕、摄像头等,然后还要一步一步地组装在一起。
但是这其中我们需要关注的东西实在太多太多,各种配件的尺寸大小,手机怎么设计、组装步骤等,而且每一步都要自己亲手来做。再者,如果我们需要的不止一部手机,而是多部呢?
最简单的解决办法:
找一个专门生产手机的工厂,不管他怎么做,只要产品能用,我们需要时直接去拿,然后给钱就行,这样一来我们就不需要再关注手机生产的过程,我们需要做的就是在需要时去获取就行,其他的问题交给工厂来处理,这就是工厂模式
1.1工厂模式
实现创建者和调用者之间的分离,解耦,降低类和类之间的依赖关系。
以前我们编写的很多程序,特别是面向对象编程的时候,往往都是先写一个父类,然后创建子类去继承,若要扩展,再继续继承,最后用 new 去获取对象的实例,这样一来,类和类之间的依赖关系就很密切,耦合度很高,这对于代码的扩展和维护来说觉得不是一件好事,而工厂模式就很好地解决了这个问题。
2.简单工厂模式
以手机产品为例,当我们(User)需要使用产品时,来看看工厂(Factory)模式应怎么去生成手机
2.1 明确我们要生产的东西
//Phone.java
package com.tsymq.factoryPattern.simpleFactory;
public class Phone {
public Phone(){
}
}
没错,仅仅是一般手机,没有任何内容的简单手机
2.2 不同的手机有不同的品牌、设计图
//XiaoMi.java
package com.tsymq.factoryPattern.simpleFactory;
public class XiaoMi extends Phone{
public XiaoMi(){
System.out.println("XiaoMi Phone. Created.");
}
}
//HuaWei.java
package com.tsymq.factoryPattern.simpleFactory;
public class HuaWei extends Phone {
public HuaWei(){
System.out.println("HuaWei Phone. Created.");
}
}
2.3 然后把设计图给工厂
//PhoneFactory.java
package com.tsymq.factoryPattern.simpleFactory;
public class PhoneFactory {
public static Phone creatPhone(String brand){
if(brand.equals("XiaoMi")){
return new XiaoMi();
}
else if(brand.equals("HuaWei")){
return new HuaWei();
}
else
return null;
}
}
2.4 获取产品
手机的生产已经交给工厂来完成,User需要时直接获取就行
//User1.java
package com.tsymq.factoryPattern.simpleFactory;
public class User1 {
public static void main(String[] args){
//用户需要时就从工厂获取
PhoneFactory.creatPhone("XiaoMi");
PhoneFactory.creatPhone("HuaWei");
}
}
3.总结和问题
总结
- 简单工厂模式可以用来生产同一等级结构中的任意产品。(对于新增加的产品,需要修改已有代码)
- 虽然某种程度不符合设计原则,但实际用的最多,事实也证明,很好用。
问题
- 若用户需要新产品,但工厂没有,就需要在工厂中添加产品才能满足用户的需求,修改了工厂。
- 若已有的产品有变化,或者工厂的生产流水线发生改变,则需修改工厂类,要找到相应的一段代码对其进行修改,也修改了工厂。