工厂模式
本质
- 实例化对象,用工厂方法代替new操作
- 将选择实现类,创建对象同意管理和控制,从而将调用者跟我们的实现类解耦
实现创建者和调用者的分离三种工厂方式
- 简单工厂模式:用来生产同一等级结构中的任意产品,对于增加的新产品,需要修改已有代码
- 工厂方法模式:用来生产同一等级结构中的固定产品,支持增加任意产品
- 抽象工厂模式:用来生产不同产品族的全部产品,对于增加新的产品,无能为力,支持增加产品族
1.简单工厂模式
公用代码
public interface Car {
void run();
}
public class Audi implements Car {
@Override
public void run() {
System.out.println("奥迪在跑");
}
}
public class Byd implements Car {
@Override
public void run() {
System.out.println("比亚迪在跑");
}
}
生产汽车代码示例
public class CarFactory {
public static Car createCar(String type){
if(type.equals("奥迪")){
return new Audi();
}else if (type.equals("比亚迪")){
return new Byd();
}else if(type.equals("宝马")){
return null;
}else {
return null;
}
}
//或者下面的创建方式
public static Car createAudi(){
return new Audi();
}
public static Car createByd(){
return new Byd();
}
}
public class Client {
public static void main(String[] args){
Car audi = CarFactory.createCar("奥迪");//CarFactory.createAudi();
Car byd = CarFactory.createCar("比亚迪");//CarFactory.createByd();
audi.run();
byd.run();
}
}
2.工厂方法模式
public interface CarFactory {
Car crateCar();
}
public class BydFactory implements CarFactory {
@Override
public Car crateCar() {
return new Byd();
}
}
public class AudiFactory implements CarFactory {
@Override
public Car crateCar() {
return new Audi();
}
}
public class Client {
public static void main(String[] args){
Car audi = new AudiFactory().crateCar();
Car byd = new BydFactory().crateCar();
}
}
抽象工厂模式
抽象工厂模式是工厂方法模式的升级版本,在有很多个业务品种,业务分类是,通过抽象工厂模式生产需要的对象是一种非常好的解决方式
发动机引擎类
public interface Engine {
void run();
void start();
}
class LuxuryEngin implements Engine{
@Override
public void run() {
System.out.println("发动机跑的快");
}
@Override
public void start() {
System.out.println("发动机启动的快");
}
}
class LowEngin implements Engine{
@Override
public void run() {
System.out.println("发动机跑的慢");
}
@Override
public void start() {
System.out.println("发动机启动的慢");
}
}
座位类
public interface Seat {
public void message();
}
class LuxurySeat implements Seat{
@Override
public void message() {
System.out.println("可自动按摩");
}
}
class LowSeat implements Seat{
@Override
public void message() {
System.out.println("不可自动按摩");
}
}
轮胎类代码
public interface Tyre {
public void resolve();
}
class LuxuryTyre implements Tyre{
@Override
public void resolve() {
System.out.println("转动不磨损");
}
}
class LowTyre implements Tyre{
@Override
public void resolve() {
System.out.println("转动磨损");
}
}
应用场景
JDK中Calendar的getInstance方法;
- JDBC中Connection对象的获取
- Hibernate中SessionFactory创建Session
- Spring中IOC容器创建管理bean
- XML解析时的DocumentBuilderFactory创建解析器对象
- 反射中Class对象的newInstance()