工厂模式
工厂模式的介绍:
工厂模式实现了调用者和实现者的分离,本质上就是把不变的部分提取出来;将可变的留作为接口,以达到最大程度上的复用。
工厂模式的分类:
1、简单工厂模式(静态工厂模式):由一个工厂类传入的参数,动态决定应该创建哪一个类的实例。
2、工厂方法模式:让子类决定实例化具体的某一个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现
简单工厂模式:虽然可以通过工厂来创建对象,但违反了开闭原则,但添加新功能时需要修改代码。
/**
* 汽车工具类
* @author Justin
*
*/
public class CarFactory {
public static Car createCar(String type){
if("H".equals(type)){
return new H();
}else if("BYD".equals(type)){
return new BYD();
}else{
return null;
}
}
}
//测试简单工厂方法
public class TestSimpleFactoryCar {//调用者
public static void main(String[] args) {
//创建汽车
Car H = CarFactory.createCar("H");//创建者
Car BYD = CarFactory.createCar("BYD");
H.run();
BYD.run();
}
}
工厂方法模式:将工厂类调整为工厂接口,需要什么类型的类就使用该类实现该工厂,创建相应的实例。
/**
*工厂接口
*@author Justin
**/
public interface CarFactory{
//创建汽车
public Car createCar();
}
/**
*本田汽车类
*@author Justin
**/
public class H{
@override
public Car createH(){
return new H();
}
/**
*BYD汽车类
*@author Justin
**/
public class BYD{
@override
public Car createBYD(){
return new BYD();
}
}
/**
*测试简单工厂方法
* 工厂方法模式好处在于,以后如果再增加一辆车。只需再实现CarFactory接口即可。避免了OCP开闭原则
* 不用在原来的代码上修改,只需新增类即可。
* 例如:增加一辆奔驰,增加一个奔驰工厂BenzFactory即可。更好扩展
*/
public class TestSimpleFactoryCar {//调用者
public static void main(String[] args) {
//创建汽车
Car H = new H().createH();
Car BYD = new BYD().createBYD();
H.run();
BYD.run();
}
}
抽象工厂模式:抽象工厂模式是工厂模式的升级版,当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品对象。它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。
/**
* 发动机
* @author Justin
*
*/
public interface Engine {
void run();
void start();
}
//高级的发动机
class LuxuryEngine implements Engine{
@Override
public void run() {
System.out.println("我是转的好快的高级发动机!");
}
@Override
public void start() {
System.out.println("我的启动速度也最快!");
}
}
/**
* 低级发动机
* @author Justin
*
*/
class LowEngine implements Engine{
@Override
public void run() {
System.out.println("我是转的好慢的低级发动机!");
}
@Override
public void start() {
System.out.println("我的启动速度也最慢!");
}
}
/**
* 创建座椅
* @author Justin
*
*/
public interface Seat {
void LuxurySeat();
}
class GoodSeat implements Seat{
@Override
public void LuxurySeat() {//创建座椅
System.out.println("我是好的座椅!");
}
}
/**
* 创建轮子
* @author Justin
*
*/
public interface Tyre {
void LuxuryTyre();
}
class GoodTyre implements Tyre{
@Override
public void LuxuryTyre() {
System.out.println("我是好的轮子");
}
}
/**
* 高端汽车的制造工厂
* @author Justin
*
*/
class LuxuryCarFactory implements CarFactory{
@Override
public Engine createEngine() {
return new LuxuryEngine();
}
@Override
public Seat createSeat() {
return new GoodSeat();
}
@Override
public Tyre createTyre() {
return new GoodTyre();
}
public static void main(String [] args){
//想要好的车
CarFactory car=new LuxuryCarFactory();
Engine engine=car.createEngine();//创建高端的发动机
engine.run();
engine.start();
}
}
应用场景
JDK中的Calendar的getInstance方法
JDBC中Connection对象的获取getConnection
Hibernate中SessionFactory创建Session
spring中的IOC容器创建管理bean对象的时候也是工厂模式
XML解析时的DocumentBuilderFactory创建解析器对象
反射中Class对象的newInstance方法。