引言
生活中我们使用的任何产品基本上都经过了工厂生产制造到销售的过程,我们并不关注产品是如何制造的,我们关注的只是产品的品牌,比如说手机,我们立刻会想起苹果,我们知道这个牌子的手机性能好,那么我们只需要购买一台aphone手机就可以啦,至于手机在工厂里如何组装的,我们并不需要关注,那是苹果手机制造商该关注的事情,有没有发现,这样就提高了客户的满意度,掏钱买省心嘛!
在程序设计中也是一样的,用户是只管提需求的,他不会关心你内部是如何实现的,我只需将需求提出,你给我生产就完了,这样的话用户是不是很省心,没错,这就是工厂帮助我们解决的事情。
概念
工厂模式也是在开发中常用的模式之一,它取代了传统的客户端采用new方式的实例化模式,而是将创建对象的任务交给了后台工厂来完成,就比如spring框架中的bean工厂,这种模式可以让后台类的改变不影响客户端的程序,大大降低了类之间的耦合。
设计思想
高内聚低耦合。
设计原则
在这里还是得强调一下,不管什么设计模式,其实都是遵循了以下原则:
1.单一职责原则
2.依赖倒转原则
3.开放-封闭原则
4.聚合-组合原则
5.里氏代换原则
实现
我们就以手机的例子进行工厂模式的案例讲解。我们知道手机的品牌有苹果,三星,华为等,那么现在需要实现的就是用户只需要输入手机品牌你就给我生产一部手机就可以啦。下面我们分别以简单工厂–》工厂–》抽象工厂得顺序一步步进行讲解,看看这种模式是如何一步步实现上述所说的设计思想和原则的。
简单工厂
Uml类图图示样例1-1
Phone接口
public interface Phone {
Phone producePhone();
}
Iphone类
public class Iphone implements Phone{
@Override
public Phone producePhone() {
// TODO Auto-generated method stub
return new Iphone();
}
Huawei类
public class Huawei implements Phone{
@Override
public Phone producePhone() {
// TODO Auto-generated method stub
return new Huawei();
}
}
工厂类:
public class PhoneFactory {
public static Phone getPhone(String name){
if(name.equals("iphone")){
Iphone iphoneX=new Iphone();
iphoneX.producePhone();
}else if(name.equals("huawei")){
Huawei mate7=new Huawei();
mate7.producePhone();
}
return null;
}
}
客户端调用:
PhoneFactory phone=new PhoneFactory ();
Phone mate7=Phone.getPhone(“huawei”);
小结:可以看出简单工厂虽然解决了类之间的耦合问题,但是却在工厂类中进行了大量的条件语句判断,如果我们此时需要增加三星手机,则需要对工厂类的条件判断语句进行修改,这很显然违背了开放-封闭原则,我们接下来看看工厂设计模式对此做了哪些改善。
工厂
Uml类图图示样例1-2
IFactoryInter接口:
public interface IFactoryInter {
Phone getPhone();
}
IphoneFactory :
public class IphoneFactory implements IFactoryInter{
@Override
public Phone getPhone() {
// TODO Auto-generated method stub
Phone iphoneX=new Iphone();
return iphoneX.producePhone();
}
}
HuaweiFactory :
public class HuaweiFactory implements IFactoryInter{
@Override
public Phone getPhone() {
// TODO Auto-generated method stub
Phone mate7=new Huawei();
return mate7.producePhone();
}
}
客户端:
IFactoryInter factory=new HuaweiFactory ();
Phone mate7=Factory.getPhone();
小结:可以看到此时如果想要三星手机,只需要增加三星手机类及三星工厂就可以了,并不需要修改原代码,这就符合了开放-封闭原则。
那么此时如果我还需要电脑产品,那么此时该怎么办呢?接着我们看看抽象工厂如何实现的。
抽象工厂
Uml类图图示样例1-3
Computer 接口:
public interface Computer {
Computer productComputer();
}
HuaweiComputer 类:
public class HuaweiComputer implements Computer{
@Override
public Computer productComputer() {
// TODO Auto-generated method stub
return new HuaweiComputer();
}
}
AppleMacbook 类:
public class AppleMacbook implements Computer{
@Override
public Computer productComputer() {
// TODO Auto-generated method stub
return new AppleMacbook();
}
}
IphoneFactory 工厂:
public class IphoneFactory implements IFactoryInter{
@Override
public Phone getPhone() {
// TODO Auto-generated method stub
Phone iphoneX=new Iphone();
return iphoneX.producePhone();
}
@Override
public Computer getComputer() {
// TODO Auto-generated method stub
Computer c=new AppleMacbook();
return c.productComputer();
}
}
HuaweiFactory 工厂:
public class HuaweiFactory implements IFactoryInter{
@Override
public Phone getPhone() {
// TODO Auto-generated method stub
Phone mate7=new Huawei();
return mate7.producePhone();
}
@Override
public Computer getComputer() {
// TODO Auto-generated method stub
Computer c=new HuaweiComputer();
return c.productComputer();
}
}
客户端:
IFactoryInter factory=new HuaweiFactory ();
Computer hauwei=Factory.getComputer();
小结:此时你会发现不管你想要电脑还是什么别的产品,只需要增加相应的产品类及产品工厂就可以了,此时程序的结构在拓展性上是不是很方便。
到这里工厂的整个设计模式就介绍结束了,应该说这个设计模式并不难,很好理解,在日常的项目中也是使用的最多的。
总结
很多时候我们总会有这样的疑问,怎么这么多设计模式,而且感觉大部分设计模式长的都差不多,之所以有这样的问题是因为你过于注重模式了,其实真正的大牛只关注设计原则,只要设计出可维护,可扩展的程序,不管你用什么模式,都是成功的,正如张无忌学太极,思想到位了,招式什么的并不重要。