Java设计模式之工厂模式
摘要:主要记录工厂系列的设计模式、静态工厂、简单工厂、抽象工厂和模拟了spring的BeanFactory。同时对他们的优劣做了简单的对比。
一:简介
什么叫做工厂?从现实的角度上说、就是生产一些实际的东西而存在的场所、比如造船厂、造纸厂、汽车厂等等。让我一下就可以想的到:哦这些长是生产这些东西的。相比于我们的Java程序中、我们需要一个对象一般都是由自己new Object()来产生我们想要的对象、但是我们获取Object实例的时候只能调用new、使用他指定的方式来生产实例、那么我们想在造出自己想要的东西的时候多一些额外的操作呢?答案:通过代码搭建的工厂来造实例、而不是手动造。
那在Java代码中哪里有工厂呢?当然没有真正的工厂!所谓的工厂就是使用Java代码实现的创建实例的一种方式、比如 常用的单例模式就是一种静态工厂方法、他使用getInstance这个方法获取唯一的实例、那这个getInstance就有点工厂的味道了、更确切的讲是工厂中员工的味道、因为他为我们生产实例。
二:静态工厂模式
从简介中也知道、单例模式就是一种静态工厂模式。同时在JDK中搜索getInstance你会发现非常多、说明这种静态工厂模式在JDK中的使用也是非常普遍。至于是不是单例则不一定。如果我们给生成单例的类换个名称:SingletonFactory、是不是就更贴切一点了?比如这篇笔记围绕的问题、如何达到任意定制交通工具、任意定制生产过程?我们先实现一个生产一辆car的工厂、只允许有这一辆car――Car单例模式:
package com.chy.dp.factory;
import java.util.ArrayList;
import java.util.List;
public class SingletonCar implements Moveable {
// 如果只有这一辆car、则是单例模式
private static SingletonCar car;
@SuppressWarnings("unused")
// 如果填充这个List则是多例模式
private static List
carList = new ArrayList
(); private SingletonCar() { } public static SingletonCar getInstance() { if (car == null) { car = new SingletonCar(); } return car; } @Override public void run() { System.out.println("冒着烟奔跑中car..."); } }
三:简单工厂模式
1、如何达到任意定制交通工具、任意定制生产过程?
2、我们要达到任意制定交通工具、则必须要有多态的存在、那么就需要定义一个所有制作交通工具的具体工厂的抽象类工厂或者接口――VehicleFactory代码:
package com.chy.dp.factory;
public abstract class VehicleFactory {
public abstract Moveable create();
}
3、因为VehicleFactory制造的是任意性质的交通工具、create方法返回的就不能是一个具体的交通工具类、而是他们的抽象接口――Moveable代码:
package com.chy.dp.factory;
public interface Moveable {
public void run();
}
4、既然Moveable是所有交通工具都具有的性能、所以所有的交通工具都要实现这个接口――Car代码:
package com.chy.dp.factory;
public class Car implements Moveable{
@Override
public void run() {
System.out.println("冒着烟奔跑中car...");
}
}
5、前面我们就提到过、我们需要一个真实的Car、可以使用专门生产Car的工厂来为我们造出来、又因为需要达到任意性、那么我们这个专门生产Car的CarFactory也需要实现VehicleFactory――CarFactory代码:
package com.chy.dp.factory;
public class CarFactory extends VehicleFactory{
@Override
public Moveable create() {
return new Car();
}
}
6、当我们拥有了上面的先天条件之后、让VehicleFactory来为我们制造一个Car是多么简单的事情――Client代码:
package com.chy.dp.factory;
public class Client {
public static void main(String[] args) {
VehicleFactory factory = new CarFactory();
Moveable m = factory.create();
m.run();
}
}
7、到现在那么前面说好的任意定制交通工具、任意定制生产过程就已经达到了。比如我们Client中又想使用飞机了、那我们就可以使用VehicleFactory造一个飞机出来。当然、我们要指定是什么样式的飞机、指定哪家造飞机的来为我们制造、不选的话我们一条龙帮你服务、默认一个飞机制造厂。
a) Plane:
package com.chy.dp.factory;
public class Plane implements Moveable {
@Override
public void run() {
System.out.println("plan is flying...");
}
}
b) PlaneFactory:
package com.chy.dp.factory;
public class PlaneFactory extends VehicleFactory {
@Override
public Moveable create() {
return new Plane();
}
}
c) Client:
package com.chy.dp.factory;
public class Client {
public static void main(String[] args) {
//VehicleFactory factory = new CarFactory();
VehicleFactory factory = new PlaneFactory();
Moveable m = factory.create();
m.run();
}
}
8、到这里、我们发现可以改动很少的代码就可以实现获取我们想要的交通工具、别说什么还要写工具类、工厂类、这个问题就像没有车你非要开一样。
四:抽象工厂
1、作用:
抽象工厂是控制一系列产品的生产、如果想要替换一系列的产品就可以使用抽象工厂、比如很多的换皮肤的功能、换主题的功