在设计原则中有这样一句话“我们应该针对接口编程,而不是正对实现编程”。这就是所谓的DIP原则。但是我们还是在一直使用new关键字来创建一个对象,这不就是在针对实现编程么?
针对接口编程,可以隔离掉以后系统可能发生的一大堆改变。入股代码是针对接口而写,那么可以通过多态,它可以与任何新类实现该接口。但是,当代码使用一大堆的具体类时,等于是自找麻烦,因为一旦加入新的具体类,就必须要改变代码。在这里我们希望能够调用一个简单的方法,我传递一个参数过去,就可以返回给我一个相应的具体对象,这个时候我们就可以使用简单工厂模式。
简单工厂模式的定义:
简单工厂模式又称之为静态工厂方法,属于创建型模式。在简单工厂模式中,可以根据传递的参数不同,返回不同类的实例。简单工厂模式定义了一个类,这个类专门用于创建其他类的实例,这些被创建的类都有一个共同的父类。
当我们没有使用简单工厂模式的时候,我们如果要创建相关的对象的时候,我们的代码如下:
(1)首先是一个Interface Car:
public interface Car {
void run();
}
(2)接着是俩个实现类:
Audi:
public class Audi implements Car {
public void run(){
System.out.println("奥迪在跑");
}
}
Byd:
public class Byd implements Car{
public void run(){
System.out.println("比亚迪在跑");
}
}
(3)在没有使用简单工厂模式的时候,一个调用者如果需要创建相关的对象的代码如下:
public class Client01 {//这是相当于调用者
public static void main(String[] args){
// 调用者不仅需要与接口进行打交道,还需要与具体的实现类进行打交道。这违反了DIP原则。
Car c1=new Audi();
Car c2=new Byd();
c1.run();
c2.run();
}
}
这个简单项目的类图关系如下:
从这个类图关系可以看出,调用者Client01既需要与接口打交道,也需要与具体的实现类进行打交道。这就很明显地增加了类之间的耦合关系。
但是当我们使用了简单工厂模式以后,那么一切很明显就变得简单起来了:
方法一:
//其实简单工厂设计模式还是有一点小小的问题的。比如说当我需要再增加一种类型的车子的时候,那么
//我就需要在这种代码的原有的基础上进行修改。这就是违反了OCP原则。为了改进,其实可以利用工厂方法设计模式来进行创建
public class CarFacory01 {
public static Car createCar(String type){
if("奥迪".equals(type)){
return new Audi();
}else if("比亚迪".equals(type)){
return new Byd();
}else{
return null;
}
}
方法二:
//同时也可以使用这种方法来创建所需要的车。也正是因为这种方法,所以简单工厂设计模式,也叫做
//静态工厂设计模式。
public class CarFactory02 {
public static Car createAudi(){
return new Audi();
}
public static Car createByd(){
return new Byd();
}
}
如果是使用了简单工厂设计模式,那么调用者Client02就不需要与具体的实现类进行打交道了:具体的代码如下:
//如果是利用了简单工厂设计模式的话,那么我们的调用者就不需要与具体的实现类进行打交道了。
//也就是说调用者不用关心车这个对象是怎么构造出来的,只要给定参数,我就可以给你创造出一个对象了。
public class Client02 {
public static void main(String[] args){
Car c1=CarFacory01.createCar("奥迪");
Car c2=CarFacory01.createCar("比亚迪");
c1.run();
c2.run();
}
}
最后运行的结果为:
奥迪在跑
比亚迪在跑
使用了简单工厂设计模式以后,那么整个类图的关系如下:
对于内部的类之间的关系来说,各个类之间的关系变得复杂了,但是对于外部的调用者client02来说,就变得简单多了。因为外部的调用者不再需要与具体的实现类进行打交道。它只需要传入一个简单的参数,就可以进行对象的创建了。