Java工厂模式优雅地创建对象以及提高代码复用率和灵活性

 更新时间:2023年05月04日 09:18:06   作者:.番茄炒蛋  
Java工厂模式是一种创建型设计模式,通过定义一个工厂类来封装对象的创建过程,将对象的创建和使用分离,提高代码的可维护性和可扩展性,同时可以实现更好的代码复用和灵活性

介绍

Java工厂设计模式主要分为三种:

简单工厂模式(Simple Factory Pattern):使用一个工厂类来封装对象创建的过程,客户端只需要通过传递不同的参数来获取不同的产品对象,从而避免了客户端直接创建产品对象的操作

工厂方法模式(Factory Method Pattern):将工厂类抽象出来,每个具体产品类对应一个具体工厂类,工厂类通过多态性来创建对应的产品对象,客户端只需要知道工厂接口及其实现类即可,可以根据需求动态切换工厂实现,扩展性更好.

抽象工厂模式(Abstract Factory Pattern):在工厂方法模式的基础上,将工厂类再进行一次抽象,将多个工厂接口放到一个工厂接口中,每个具体产品对应一个具体工厂类,通过多态性来创建对应的产品对象,具有更好的扩展性和更高的抽象程度,但是也增加了系统复杂度

简单工厂模式

首先先定义一个抽象产品类:

package com.fanqiechaodan.factory.simple.product;
/**
 * @Classname Product
 * @Description 抽象产品类
 */
public abstract class Product {
    public abstract void use();
}

然后定义具体产品类

public class ProductA extends Product{
    @Override
    public void use() {
        System.out.println("使用具体产品类A...");
    }
}
public class ProductB extends Product{
    @Override
    public void use() {
        System.out.println("使用具体产品类B...");
    }
}
public class ProductC extends Product{
    @Override
    public void use() {
        System.out.println("使用具体产品类C...");
    }
}

接下来定义工厂类,用于创建不同的产品

package com.fanqiechaodan.factory.simple.factory;
import com.fanqiechaodan.factory.simple.product.Product;
import com.fanqiechaodan.factory.simple.product.ProductA;
import com.fanqiechaodan.factory.simple.product.ProductB;
import com.fanqiechaodan.factory.simple.product.ProductC;
/**
 * @Classname SimpleFactory
 * @Description 工厂类
 */
public class SimpleFactory {
    public static Product createProduct(String type) {
        switch (type) {
            case "A":
                return new ProductA();
            case "B":
                return new ProductB();
            case "C":
                return new ProductC();
            default:
                throw new RuntimeException("不支持的产品类型:" + type);
        }
    }
}

测试:

package com.fanqiechaodan.factory.simple;
import com.fanqiechaodan.factory.simple.factory.SimpleFactory;
import com.fanqiechaodan.factory.simple.product.Product;
/**
 * @Classname Demo
 * @Description 简单工厂模式
 */
public class Demo {
    public static void main(String[] args) {
        Product productA = SimpleFactory.createProduct("A");
        productA.use();
        Product productB = SimpleFactory.createProduct("B");
        productB.use();
        Product productC = SimpleFactory.createProduct("C");
        productC.use();
        Product productD = SimpleFactory.createProduct("D");
        productD.use();
    }
}

工厂方法模式

首先定义一个接口表示产品

package com.fanqiechaodan.factory.method.product;
/**
 * @Classname Product
 * @Description 产品接口
 */
public interface Product {
    void use();
}

其次定义两个具体的产品实现类

public class ProductA implements Product{
    @Override
    public void use() {
        System.out.println("使用具体产品A...");
    }
}
public class ProductB implements Product{
    @Override
    public void use() {
        System.out.println("使用具体产品B...");
    }
}

然后定义一个工厂接口用于创建产品

package com.fanqiechaodan.factory.method.factory;
import com.fanqiechaodan.factory.method.product.Product;
/**
 * @Classname Factory
 * @Description 工厂接口
 */
public interface Factory {
    Product createProduct();
}

接下来,定义两个具体的工厂实现类,分别用于创建不同的产品

public class FactoryA implements Factory{
    @Override
    public Product createProduct() {
        return new ProductA();
    }
}
public class FactoryB implements Factory{
    @Override
    public Product createProduct() {
        return new ProductB();
    }
}

测试

package com.fanqiechaodan.factory.method.factory;
import com.fanqiechaodan.factory.method.product.Product;
import com.fanqiechaodan.factory.method.product.ProductB;
/**
 * @Classname FactoryB
 * @Description 工厂实现类B
 */
public class FactoryB implements Factory{
    @Override
    public Product createProduct() {
        return new ProductB();
    }
}

抽象工厂模式

首先定义抽象产品

public interface ProductA {
    void doSomething();
}
public interface ProductB {
    void doSomething();
}

其次定义具体产品

public class ProductA1 implements ProductA{
    @Override
    public void doSomething() {
        System.out.println("ProductA1 doSomething ...");
    }
}
public class ProductA2 implements ProductA{
    @Override
    public void doSomething() {
        System.out.println("ProductA2 doSomething ...");
    }
}
public class ProductB1 implements ProductB{
    @Override
    public void doSomething() {
        System.out.println("ProductB1 doSomething ...");
    }
}
public class ProductB2 implements ProductB{
    @Override
    public void doSomething() {
        System.out.println("ProductB2 doSomething ...");
    }
}

然后定义抽象工厂

package com.fanqiechaodan.factory.abstractfactory.factory;
import com.fanqiechaodan.factory.abstractfactory.product.ProductA;
import com.fanqiechaodan.factory.abstractfactory.product.ProductB;
/**
 * @Classname AbstractFactory
 * @Description 抽象工厂
 */
public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

接下来定义具体工厂

public class Factory1 implements AbstractFactory{
    @Override
    public ProductA createProductA() {
        return new ProductA1();
    }
    @Override
    public ProductB createProductB() {
        return new ProductB1();
    }
}
public class Factory2 implements AbstractFactory{
    @Override
    public ProductA createProductA() {
        return new ProductA2();
    }
    @Override
    public ProductB createProductB() {
        return new ProductB2();
    }
}

测试

package com.fanqiechaodan.factory.abstractfactory;
import com.fanqiechaodan.factory.abstractfactory.factory.AbstractFactory;
import com.fanqiechaodan.factory.abstractfactory.factory.Factory1;
import com.fanqiechaodan.factory.abstractfactory.factory.Factory2;
import com.fanqiechaodan.factory.abstractfactory.product.ProductA;
import com.fanqiechaodan.factory.abstractfactory.product.ProductB;
/**
 * @Classname Demo
 * @Description 抽象工厂模式
 */
public class Demo {
    public static void main(String[] args) {
        // 使用具体工厂1创建产品A和产品B
        AbstractFactory factory1 = new Factory1();
        ProductA productA1 = factory1.createProductA();
        ProductB productB1 = factory1.createProductB();
        productA1.doSomething();
        productB1.doSomething();
        // 使用具体工厂2创建产品A和产品B
        AbstractFactory factory2 = new Factory2();
        ProductA productA2 = factory2.createProductA();
        ProductB productB2 = factory2.createProductB();
        productA2.doSomething();
        productB2.doSomething();
    }
}

总结

简单工厂模式

优点:

  • 简单易用,客户端只需要知道工厂类和产品类即可
  • 工厂类负责创建对象,客户端无需知道具体得实现细节
  • 可以根据参数动态创建对象

缺点:

  • 工厂类负责创建所有得产品对象,当产品类型过多时,工厂类会变得十分臃肿
  • 添加新产品需要修改工厂类的代码,违反了开闭原则

工厂方法模式

优点:

  • 将每个产品类型的创建部分分散到具体的工厂类中,避免了简单工厂模式中工厂类臃肿的问题
  • 添加新产品只需要添加具体工厂类即可,符合开闭原则

缺点:

  • 客户端需要知道所有具体工厂类,使用起来不够灵活
  • 每个产品类型都需要对应一个具体的工厂类,增加了系统类的个数,增加了系统的复杂度

抽象工厂模式

优点:

  • 可以创建一组相关的产品对象,确保这些对象之间的兼容性
  • 隐藏了产品对象的具体实现,客户端只需要知道抽象工厂和抽象产品即可
  • 可以通过替换具体工厂来实现不同的产品组合,提高了系统的灵活性

缺点;

  • 增加了系统的抽象性和复杂度,需要定义多个抽象工厂接口和多个具体工厂类
  • 不容易支持新种类的产品,需要添加新的产品工厂接口和具体工厂类

到此这篇关于Java工厂模式优雅地创建对象以及提高代码复用率和灵活性的文章就介绍到这了,更多相关Java工厂模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot使用PropertiesLauncher加载外部jar包

    SpringBoot使用PropertiesLauncher加载外部jar包

    这篇文章主要介绍了SpringBoot使用PropertiesLauncher加载外部jar包,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 深入了解java中的string对象

    深入了解java中的string对象

    这篇文章主要介绍了java中的string对象,String对象是Java中使用最频繁的对象之一,所以Java开发者们也在不断地对String对象的实现进行优化,以便提升String对象的性能。对此感兴趣的朋友跟随小编一起看看吧
    2019-11-11
  • IDEA修改SVN地址的实现

    IDEA修改SVN地址的实现

    如果你正在使用SVN进行版本控制,并且需要更改你的SVN地址,那么这篇文章将为你提供必要的步骤和指导,感兴趣的可以了解一下
    2023-12-12
  • Java中Prime算法的原理与实现详解

    Java中Prime算法的原理与实现详解

    Prime算法是一种穷举查找算法来从一个连通图中构造一棵最小生成树。本文主要为大家介绍了Java中Prime算法的原理与实现,感兴趣的可以学习一下
    2022-07-07
  • 详解Java的JDBC中Statement与PreparedStatement对象

    详解Java的JDBC中Statement与PreparedStatement对象

    这篇文章主要介绍了详解Java的JDBC中Statement与PreparedStatement对象,PreparedStatement一般来说比使用Statement效率更高,需要的朋友可以参考下
    2015-12-12
  • java运行shell脚本方法示例

    java运行shell脚本方法示例

    利用Runtime.execute方法,我们可以在Java程序中运行Linux的Shell脚本,或者执行其他程序
    2013-12-12
  • JAVA加密算法数字签名实现原理详解

    JAVA加密算法数字签名实现原理详解

    这篇文章主要介绍了JAVA加密算法数字签名实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 关于feign对x-www-form-urlencode类型的encode和decode问题

    关于feign对x-www-form-urlencode类型的encode和decode问题

    这篇文章主要介绍了关于feign对x-www-form-urlencode类型的encode和decode问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SharedingSphere 自定义脱敏规则介绍

    SharedingSphere 自定义脱敏规则介绍

    这篇文章主要介绍了SharedingSphere 自定义脱敏规则,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java连接orcale数据库示例分享

    java连接orcale数据库示例分享

    这篇文章主要介绍了java连接orcale数据库示例,需要的朋友可以参考下
    2014-02-02

最新评论