工厂模式
工厂模式大家应该都听过,但是可能大家更多的是处于听的一个状态,工厂模式其实从名字可以看出来,是一个工厂,那么正如他的名字一样,工厂生产加工然后制造出零件供我们使用,那么我们中间的加工的步骤都是由工厂来进行完成,我们拿到的是一个成品,所以我们可以知道其实工厂模式就是可以让我们不用知道其中间的步骤,只需要关心我们拿到的东西。
那么我们下面用代码进行演示
首先我们创建一个汽车的接口定义它的类型(跑车或者是卡车)
/**
* 汽车
*/
public interface Car {
String type();
}
创建它的实现类,玛莎拉蒂和东风卡车
/**
* 玛莎拉蒂
*/
public class Maserati implements Car{
public String type() {
return "玛莎拉蒂:跑车";
}
}
/**
* 东风卡车
*/
public class Dongfeng implements Car {
public String type() {
return "东风:卡车";
}
}
测试
public class Test {
public static void main(String[] args) throws Exception {
//如果我们不使用工厂模式那么我们创建对象会使用new
System.out.println(new Maserati().type());
}
}
输出
但是如果创建的过程比较复杂,并且有大量的重复工作 这时候如果我们还是去new那就会很麻烦下面我们使用简单工厂模式
创建简单的工厂
/**
*简单的工厂
*/
public class SimpleFactory {
public Car creatCar(String type) throws Exception {
//type这里其实可以使用枚举
if (type==null||"".equals(type)){
throw new Exception("没有该类型");
}
if ("玛莎拉蒂".equals(type)){
return new Maserati();
}else if ("东风".equals(type)){
return new Dongfeng();
}else {
throw new Exception("没有该类型");
}
}
}
测试
public class Test {
public static void main(String[] args) throws Exception {
//但是如果创建的过程比较复杂,并且有大量的重复工作
//这时候如果我们还是去new那就会很麻烦下面我们使用简单工厂模式
System.out.println(new SimpleFactory().creatCar("玛莎拉蒂").type());
//这时候就不需要关心创建的过程
System.out.println(new SimpleFactory().creatCar("东风").type());
}
}
输出
以上为简单工厂,为了使用户更好的创建自己想要的对象,那我们可以使用抽象工厂 那么我们开始创建抽象工厂
首先定义一个工厂接口
public interface Factory {
Car createCar();
}
创建东风卡车的工厂
public class DongfengFactory implements Factory {
public Car createCar() {
return new Dongfeng();
}
}
创建玛莎拉蒂的工厂
public class MaseratiFactory implements Factory {
@Override
public Car createCar() {
return new Maserati();
}
}
创建抽象工厂,这里使用的是抽象类,而不是接口,因为抽象类还可以写一些初始化的方法等等
/**
* 抽象工厂
*/
public abstract class AbstractFactory {
//这里还可以写很多初始化的一些东西
abstract Car creactDongfengCar();
abstract Car creactMaseratiCar();
}
创建抽象工厂的实现类
public class CarFactory extends AbstractFactory {
@Override
public Car creactDongfengCar() {
return new DongfengFactory().createCar();
}
@Override
public Car creactMaseratiCar() {
return new MaseratiFactory().createCar();
}
}
测试
public class Test {
public static void main(String[] args) throws Exception {
System.out.println(new CarFactory().creactDongfengCar().type());
System.out.println(new CarFactory().creactMaseratiCar().type());
//我们可以看到这样创建对象的方式非常的方便,而且拓展起来也很方便
//我们只需要在抽象工厂中加入创建的api即可
}
}
输出
由此我们可以对工厂模式有一个大概的了解,我们学习设计模式的时候一定要知道设计模式是为了提升代码的可读性和拓展性
所以我们不要去生拉硬套,应该根据合适的业务去思考使用