1.工厂模式的作用
实现了创建者和调用者的分离
2…工厂模式分类:
• 简单工厂模式
• 工厂方法模式
• 抽象工厂模式
3…工厂模式核心本质:
1.实例化对象,用工厂方法代替new操作。
2.将调用者跟我们的实现类解耦.
一:简单工厂:
1.特点:用来生产同一等级结构中的任意产品。
2.缺点:对于增加新的产品, 需要修改已 有代码,违反了开闭原则。
3.代码案例: Car(接口) ,AoDi(类),BiYaDi(类)
package com.example.shejimoshi.factory;
public interface Car {
void run();
}
package com.example.shejimoshi.factory;
public class AoDi implements Car {
@Override
public void run() {
System.out.println("奥迪在跑");
}
}
package com.example.shejimoshi.factory;
public class BiYaDi implements Car {
@Override
public void run() {
System.out.println("比亚迪在跑");
}
}
如果不使用工厂模式的话 调用者需要知道很多东西 这样分工就不明确了
package com.example.shejimoshi.factory;
//不使用工厂模式
public class Test {
public static void main(String[] args) {
Car car1 = new AoDi();
Car car2 = new BiYaDi();
car1.run();
car2.run();
}
}
现在使用工厂方法只需要和工厂打交道 让创建对象的事情由工厂来做:
package com.example.shejimoshi.factory;
//简单工厂 用来创对象 新增功能只能修改代码 这是缺点
public class SimpleFactory {
public static Car createAoDi()
{
return new AoDi();
}
public static Car createBiYaDi()
{
return new BiYaDi();
}
}
使用简单工厂调用:
package com.example.shejimoshi.factory;
public class Test2 {
//这样就只需要和工厂打交道
public static void main(String[] args) {
Car car1 = SimpleFactory.createAoDi();
Car car2 = SimpleFactory.createBiYaDi();
car1.run();
car2.run();
}
}
虽然简单工厂如果修改一定要改代码 但是用它的还是比较多 这样的缺点还是可以接受的。
二:工厂方法:
1.工厂方法模式要点:
1):为了避免简单工厂模式的缺点,不完全满足OCP(开闭原则)。
2):工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目 或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。
2.代码案例:
package com.example.shejimoshi.factorymethod;
public interface Car {
void run();
}
package com.example.shejimoshi.factorymethod;
public class AoDi implements Car {
@Override
public void run() {
System.out.println("奥迪在跑");
}
}
package com.example.shejimoshi.factorymethod;
public class BiYaDi implements Car {
@Override
public void run() {
System.out.println("比亚迪在跑");
}
}
package com.example.shejimoshi.factorymethod;
//所有的实例工厂都实现此接口
public interface CarFactory {
Car createCar();
}
package com.example.shejimoshi.factorymethod;
public class AoDiFactory implements CarFactory {
@Override
public Car createCar() {
return new AoDi();
}
}
package com.example.shejimoshi.factorymethod;
public class BiYaDiFactory implements CarFactory {
@Override
public Car createCar() {
return new BiYaDi();
}
}
调用:
package com.example.shejimoshi.factorymethod;
public class Test {
public static void main(String[] args) {
Car car1 = new AoDiFactory().createCar();
Car car2 = new BiYaDiFactory().createCar();
car1.run();
car2.run();
}
}
工厂方法优点:新增功能不需要该已有代码 满足开闭原则
缺点:每增加一个功能就要新建一个工厂类来实现用于创建对象的接口。
三:抽象工厂:
不可以增加产品,可以增加产品族!
应用场景
– JDK中Calendar的getInstance方法
– JDBC中Connection对象的获取 – Hibernate中SessionFactory创建Session
– spring中IOC容器创建管理bean对象
– XML解析时的DocumentBuilderFactory创建解析器对象
– 反射中Class对象的newInstance()