在软件开发中,我们经常会遇到创建对象的需求。通常情况下,我们可以直接使用 new
关键字来创建对象,但在某些情况下,直接创建对象可能会导致代码的耦合度增加,不利于代码的扩展和维护。这时候,工厂模式就可以发挥作用了。
例如:
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而不需要暴露对象的创建逻辑。简单来说,工厂模式就是将对象的创建过程封装起来,客户端不需要关心对象是如何创建的,只需要通过工厂来获取所需的对象即可。
工厂模式通常分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。
让我们通过一个简单的示例来说明简单工厂模式的具体实现。假设我们有一个形状接口 Shape
和其实现类 Circle
和 Rectangle
,我们希望通过一个工厂类 ShapeFactory
来创建这些形状对象。
// 形状接口
interface Shape {
void draw();
}
// 圆形类
class Circle implements Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
// 矩形类
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
// 形状工厂类
class ShapeFactory {
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();
}
return null;
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
// 获取圆形对象,并调用绘制方法
Shape circle = shapeFactory.getShape("Circle");
circle.draw();
// 获取矩形对象,并调用绘制方法
Shape rectangle = shapeFactory.getShape("Rectangle");
rectangle.draw();
}
}
首先定义一个抽象类产品接口和两个具体产品的实现。再定义一个抽象工厂接口和两个实现工厂。
抽象类产品接口:
//抽象产品类
public interface Produce {
//产品描述
void operation();
}
//产品A
public class ProduceA implements Produce{
@Override
public void operation() {
System.out.println("具体产品A描述");
}
}
//产品B
public class ProduceB implements Produce{
@Override
public void operation() {
System.out.println("具体产品B描述");
}
}
抽象工厂实现
//工厂创建产品的接口
public interface Factory {
Produce createProduct();
}
//工厂A
public class FactoryA implements Factory{
@Override
public Produce createProduct() {
return new ProduceA();
}
}
//工厂B
public class FactoryB implements Factory{
@Override
public Produce createProduct() {
return new ProduceB();
}
}
实现结构:
产品族A:
//抽象类产品族A
public interface AbstractProductA {
void operationA();
}
//产品A具体实现
public class ConcreteProductA1 implements AbstractProductA{
@Override
public void operationA() {
System.out.println("ConcreteProductA1 Operation");
}
}
//产品A具体实现
public class ConcreteProductA2 implements AbstractProductA{
@Override
public void operationA() {
System.out.println("ConcreteProductA2 operation");
}
}
产品族B:
//抽象类产品族B
public interface AbstractProductB {
void operationB();
}
//产品B具体实现
public class ConcreteProductB1 implements AbstractProductB{
@Override
public void operationB() {
System.out.println("ConcreteProductB1 operation");
}
}
//产品B具体实现
public class ConcreteProductB2 implements AbstractProductB{
@Override
public void operationB() {
System.out.println("ConcreteProductB2 operation");
}
}
抽象工厂:
//抽象类工厂
public interface AbstractFactory {
AbstractProductA createProductA();
AbstractProductB createProductB();
}
//工厂A实现
public class ConcreteFactory1 implements AbstractFactory{
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
//工厂B实现
public class ConcreteFactory2 implements AbstractFactory{
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB2();
}
}
创建及结构对比:
优缺点对比:
工厂模式是一种常用的设计模式,它可以帮助我们更好地管理对象的创建过程,降低代码的耦合度,提高代码的复用性和扩展性。在实际项目中,根据不同的需求可以选择不同类型的工厂模式来创建对象,从而更好地满足项目的需求。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- bangwoyixia.com 版权所有 湘ICP备2023022004号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务