想要写出好的,容易复用的,解耦的代码,就必须学习到设计模式,这也正是写文章的意义,本人想把自己学习过的工厂模式进行记录,一方面方便查阅,一方面希望能加深对设计模式的认识。
今天是第一篇,由简单到容易,就记录一下工厂模式。
工厂模式:是创建型模式之一,一种简单的模式,使用工厂模式进行解耦代码,方便扩展程序以及修改程序。
个人理解就是在工厂中,我们可以生产各种各样的商品,他们有一定的共性,比如汽车,小轿车,的士等等,他们都是与车这一个种类,我们就可以将“车”当做一个工厂类进行设计,从而衍生出各种各样的车出来。
首先我们必须先定义一个车的基本特征,我们都可以知道车的共性有4个轮子,后视镜等等,这里就以这两个作为车的基本类型,将其抽象出来,然后我们进行类的设计如下:
public abstract class Che {
protected void Sheel(){
System.out.println("车的轮子");
}
public void rearviewMmirror(){
System.out.println("车的后视镜");
}
//输出车的名字
public abstract void printCarName();
}
上述代码给出了轮子和后视镜的定义,以及抽象了一个方法printCarName去输出我们具体车的名字,我们再定义的士和汽车,代码如下:
汽车
public class Car extends Che {
@Override
public void printCarName() {
System.out.println("这是汽车");
}
}
小轿车
public class Taxi extends Che{
@Override
public void printCarName() {
// TODO Auto-generated method stub
System.out.println("这是的士");
}
}
我们重写了输出名字的方法,分别输出不同车型对应的车的名字,然后我们进行工厂的简单设计:
public abstract class CheFactory {
/**
* 工厂的抽象方法,
* 具体生产什么由子类去决定
*/
public abstract Che createTheChe();
}
我们抽象使用一个工厂类,并且使用createTheChe()进行生产车,返回的类型就是Che类型。下面是工厂类的两个子类:
//汽车工厂
public class CarFactory extends CheFactory{
@Override
public Che createTheChe() {
return new Car();
}
}
//的士工厂
public class TaxiFactory extends CheFactory {
@Override
public Che createTheChe() {
return new Taxi();
}
}
我们进行测试:
public class Main {
public static void main(String[] args) {
CheFactory car=new CarFactory();
CheFactory taxi=new TaxiFactory();
car.createTheChe().printCarName();
taxi.createTheChe().printCarName();
}
}
输出的结果为:
这是汽车
这是的士
上述所示的即为最简单的工厂模式,也可以称为多工厂模式,我们从上方可以看到其实每种车的结构式大体相同的,那么我们是否就不需要定义那么多的工厂来进行设计呢?
这里我们就可以引出简单工厂模式(也称静态工厂模式):
我们重新定义工厂以及实现一个具体的工厂类,请看下述代码:
车工厂类
public abstract class CheFactory {
/**
* 工厂的抽象方法,
* 具体生产什么由子类去决定
*/
public abstract <T extends Che> T createTheChe(Class<T> class1);
}
//具体工厂类
public class Factory extends CheFactory {
@Override
public <T extends Che> T createTheChe(Class<T> class1) {
Che che=null;
try {
che=(Che) Class.forName(class1.getName()).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (T) che;
}
}
我们通过反射的方法实现具体车型的实例化操作,这样只要我们传入类即可实例化各种车型了~。