工厂模式定义
工厂模式 Factory Pattern 属于创建型模式,是 java 中最常用的设计模式,他提供了一种创建对象极佳的方法。提供了一种将对象的实例化过程封装在工厂类中的方式
意图
创建一个对象的接口,让子类决定去实例化哪一个工厂类,工厂模式使创建过程延迟到子类进行。
主要解决
主要解决接口选择问题,让创建过程在子类中执行。
应用实例
1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
2、Hibernate 换数据库只需换方言和驱动就可以。
优点
调用者想调用对象只需要知道类的名称即可,方便扩展,如果你需要你需要一个产品只需要增加一个工厂类就行。
使用场景
1、日志的保存,用户可以将日志保存在服务器,本地,云端等地方。
2、数据库的访问,用户不需要知道采用的哪一个数据库,以及数据库采取了哪些操作
3、设计链接服务器框架时,可以设计 pop3、impl、http等协议设计类,实现一个共同的接口。
工厂模型的核心角色
抽象产品、具体产品、抽象工厂、具体工厂
样例
汽车
设计产品是汽车,设计了车产品的接口,奥迪和宝马实现了车接口。相对应设计了造车的车工厂接口,奥迪工厂和宝马工厂共同实现了车工厂接口。通过具体的工厂去调用各自的车方法。
代码
车接口,以及接口实现类的设计
public interface Car {
void running();
}
public class Audi implements Car{
@Override
public void running() {
System.out.println("Audi 汽车在跑");
}
}
public class Bmw implements Car{
@Override
public void running() {
System.out.println("BMW 汽车在跑");
}
}
车工厂和具体工厂实现类的设计
public interface ICarFactory {
Car getICarFactory();
}
public class AudiFactory implements ICarFactory{
@Override
public Car getICarFactory() {
return new Audi();
}
}
public class BmwFactory implements ICarFactory{
@Override
public Car getICarFactory() {
return new Bmw();
}
}
工厂模式客户端的调用
public class FactoryClient {
public static void main(String[] args) {
BmwFactory bmwFactory = new BmwFactory();
bmwFactory.getICarFactory().running();
new AudiFactory().getICarFactory().running();
}
}
形状
简单工厂模型,设计了形状的抽象接口,具备画图的方法。三种图形的实现类,设计了图形工厂,客户端通过需要的图形名称去调用工厂。
代码
创建图形接口以及接口实现类
public interface Shape {
void draw();
}
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("Circle 执行了 draw()");
}
}
public class Rectangle implements Shape{
@Override
public void draw() {
System.out.println("Rectangle 类执行了 draw()");
}
}
public class Triangle implements Shape{
@Override
public void draw() {
System.out.println(this.getClass().getSimpleName()+"执行了"+Thread.currentThread().getStackTrace()[1].getMethodName()+"方法");
}
}
图形工厂的创建
public class ShapeFactory {
public Shape getShape(Shape shape){
if (shape instanceof Rectangle){
return new Rectangle();
} else if (shape instanceof Circle) {
return new Circle();
} else {
return new Triangle();
}
}
客户端调用
public class FactoryClient {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
shapeFactory.getShape(new Rectangle()).draw();
shapeFactory.getShape(new Circle()).draw();
shapeFactory.getShape(new Triangle()).draw();
}
}