工厂模式
工厂模式提供一种创建对象的方式,而无需指定要创建的具体类。
通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和扩展性。
意图
定义一个创建对象的接口,让其子类决定实例化哪一个具体的类。工厂模式使对象的创建过程延迟到子类。
主要解决问题
接口选择的问题
关键代码
对象的创建过程在子类中实现
实例
-
汽车制造:你需要汽车,只需要从工厂中提货,而不需要关心汽车的制造过程及其内部实现
-
Hibernate:更新数据库时,只需要更改方言和数据库驱动,即可实现对不同数据库的切换
优点
-
调用者只需要知道对象的名称即可创建对象
-
扩展性高,如果需要增加新产品,只需要扩展一个工厂类
-
屏幕了产品的具体实现,调用者只关心产品的接口
缺点
每次增加一个产品时,需要增加一个具体类和对应的工厂,使系统中类的数量成倍增加,增加系统的复杂性和具体类的依赖
使用场景
-
日志记录:日志可能记录到本地硬盘,系统事件,远程服务器等,用户可以选择记录日志的位置
-
数据库访问:当用户不知道最终系统使用哪种数据库,或者数据库可能变化时
-
连接服务器的框架设计:需要支持“POP3”,"IMAP","HTTP"三种协议,可以将这三种协议做为产品类,共同实现一个接口
注意事项
工厂模式适用于生成复杂对象的场景。如果对象较为简单,通过new即可创建,则不必使用工厂模式。使用工厂模式会引入一个工厂类,增加系统复杂度
实现
创建一个Shape接口和实现Shape接口的实体类。下一步是定义工厂类ShapeFactory.
FactoryPatternDemo类使用ShapeFactory来获取Shape对象。它将向ShapeFactory传递消息,以便获取它所需对象的类型
// 创建一个接口Shape.java
public interface Shape{
void draw();
}
创建实现接口的实体类
// Rectangle.java
public class Rectangle implements Shape{
@Override
public void draw(){
System.out.println("Inside Rectangle::draw() method.");
}
}
// Square.java
public class Square implements Shape{
@Override
public void draw(){
System.out.println("Inside Square::draw() method.");
}
}
// Circle.java
public class Circle implements Square{
@Override
public void draw(){
System.out.println("Inside Circle::draw() method.");
}
}
创建一个工厂,生成基于给定消息的实体类的对象
// ShapeFactory.java
public class ShapeFactory{
// 使用getShape方法获取形状类型的对象
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
}else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
}else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
使用该工厂,通过传递类型消息来获取实体类的对象
// FactoryPatternDemo.java
public class FactoryPatternDemo{
public static void main(String[] args){
ShapeFactory shapeFactory = new ShapeFactory();
// 获取Circle的对象,并调用它的draw()方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
// 调用Circled的draw()方法
shape1.draw();
// 获取Circle的对象,并调用它的draw()方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
// 调用Circled的draw()方法
shape2.draw();
// 获取Circle的对象,并调用它的draw()方法
Shape shape3 = shapeFactory.getShape("SQUARE");
// 调用Circled的draw()方法
shape3.draw();
}
}
标签:draw,1.0,--,工厂,对象,Shape,Circle,设计模式,public
From: https://www.cnblogs.com/data101/p/18242800