工厂模式是常用的设计模式之一,属于创建型模式,它提供了一种创建对象的最佳方式。
工厂模式提供了一种将对象实例化过程封装在工厂类中的方式。通过使用工厂模式,可以将对象的创建与使用代码分离。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
一般可以将工厂模式分为三种,分别为 简单工厂、工厂方法和抽象工厂。
简单工厂不算是一个真正的设计模式,而更像是一种我们的编程习惯,但是在平时编码中这不失为一个简单的方法,可以将客户程序从具体类解耦。
工厂类拥有一个工厂方法(create),接受了一个参数,通过不同的参数实例化不同的产品类。以生产汽车为例,如图所示:
抽象产品:创建汽车接口。
具体产品:创建宝马汽车和奔驰汽车类,实现汽车接口。
工厂类:根据传入参数的不同,创建不同的具体产品,返回值为抽象产品接口。
/**
* 抽象产品接口
*/
public interface ICar {
void run();
}
/**
* 具体产品类 实现抽象接口
*/
public class Benz implements ICar{
@Override
public void run() {
System.out.println("Benz is running");
}
}
/**
* 具体产品类 实现抽象接口
*/
public class BMW implements ICar {
@Override
public void run() {
System.out.println("BMW is running");
}
}
/**
* 简单工厂(静态工厂)
*建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
*优点是比较好理解,简单易操作。
*缺点是类的创建依赖工厂类,如果想要拓展程序,必须对工厂类进行修改,这违反了设计模式的开闭原则(OCP),即对扩展开放,对修改关闭。
*/
public class CarSimpleFactory {
public static ICar create(String type){
if(type.equals("BMW")){
return new BMW();
} else if (type.equals("Benz")) {
return new Benz();
}
return null;
}
}
/**
* 客户端调用测试
*/
public class Client {
public