设计模式-工厂模式
# 设计模式-工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
# 介绍
现在我们如果需要一台电脑,那么我们就去工厂里面提货,我们不用关心电脑是如何产生出来的,也不用关心这个电脑的内部。
**目的:**定义一个工厂,外部传来什么,工厂就返回什么。
优点:
一个调用者想创建一个对象,只要知道其名称就可以了。
扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
- 在添加新产品时需要编写新的具体产品类,而且还要提供与之对应的具体工厂类。系统中类的个数将会成对增加,在一定程序上增加了系统的复杂度。
- 由于考虑到系统的可扩展性,需要映入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度。
适用环境:
- 客户端不知道它所需要的对象的类。
- 抽象工厂类通过其子类来指定创建哪个对象。
# 案例
图形接口:
/**
* Description 图形接口
* Date 2022/3/11 22:03
* Version 1.0.1
*
* @author Wen
*/
public interface Shape {
/**
* 画图
*/
void draw();
}
三个图形:
/**
* Description 圆形
* Date 2022/3/11 22:07
* Version 1.0.1
*
* @author Wen
*/
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle的draw方法");
}
}
/**
* Description 长方形
* Date 2022/3/11 22:05
* Version 1.0.1
*
* @author Wen
*/
public class Rectangle implements Shape{
@Override
public void draw() {
System.out.println("Rectangle的draw方法");
}
}
工厂:
/**
* Description 图形工厂
* Date 2022/3/11 22:23
* Version 1.0.1
*
* @author Wen
*/
public class ShapeFactory {
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if("CIRCLE".equalsIgnoreCase(shapeType)){
return new Circle();
} else if("RECTANGLE".equalsIgnoreCase(shapeType)){
return new Rectangle();
} else if("SQUARE".equalsIgnoreCase(shapeType)){
return new Square();
}
return null;
}
}
实现:
/**
* Description 案例
* Date 2022/3/11 22:25
* Version 1.0.1
*
* @author Wen
*/
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
//获取 Circle 的对象,并调用它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
//调用 Circle 的 draw 方法
shape1.draw();
//获取 Rectangle 的对象,并调用它的 draw 方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
//调用 Rectangle 的 draw 方法
shape2.draw();
//获取 Square 的对象,并调用它的 draw 方法
Shape shape3 = shapeFactory.getShape("SQUARE");
//调用 Square 的 draw 方法
shape3.draw();
}
}
Circle的dra
上次更新: 2024/06/29, 15:13:44