「设计模式」工厂方法模式

这是我参与更文挑战的第9天,活动详情查看: 更文挑战

定义

定义一个用于创建对象的借口,让子类决定实例化那个类

使用场景

在需要创建复杂对象的地方「比如需要更具某些特性创建不同的对象,但是创建的这些对象他们都有很多共性,都可以使用工厂方法模」复杂对象想适合用工厂模式,用new就可以完成创建的对象不需要用工厂模式。
适用于一个类不知道它所需要的对象的类;一个类通过其子类来指定创建哪个对象;将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定。

代码

抽象产品类:

/**
 * 抽象产品类
 */
public abstract class Product {
    //产品类的抽象方法,由具体的产品类去实现
    public abstract void method();
}
复制代码

具体产品类:

/***
 * 具体产品类A
 */
public class ProductA extends Product{
    @Override
    public void method() {
        System.out.println("我是具体产品A");
    }
}

/***
 * 具体产品类B
 */
public class ProductB extends Product{
    @Override
    public void method() {
        System.out.println("我是具体产品类B");
    }
}
复制代码

具体产品类可以根据需求创建多个不同的。

抽象方法类:

/**
 * 抽象工厂类
 * 为了直观感受工厂方法模式, 写了两种抽象方法获取产品类
 */
public abstract class Factory {
    public abstract  <T extends Product> T createProduct(Class<T> cla);  //通过反射动态创建
    public  abstract Product createProduct(String type);  //通过type类型创建 产品对象类
}

复制代码

具体工厂类

/***
 * 具体抽象工厂
 */
public class ConcreateFactory extends Factory {
    @Override
    public <T extends Product> T createProduct(Class<T> cla) {
        Product product = null;
        try {
            product = (Product) Class.forName(cla.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) product;
    }

    @Override
    public Product createProduct(String type) {
        switch (type) {
            case "A":
                return new ProductA();
            case "B":
                return new ProductB();
        }
        return null;
    }
}

复制代码

接下来看下测试类:

public class ClientTest {
    public static void main(String[] args) {
        Factory factory = new ConcreateFactory();
        Product productA =   factory.createProduct("A");
        Product productB =   factory.createProduct(ProductB.class);
        productA.method();
        productB.method();
    }
}
复制代码

输出

工厂方法.png

通过代码可以看到,我们只需要传递我们想要生成的对象,或者type类型就可以获取到,并且执行对应的方法,如果后续需要扩展,则不用考虑些很多判断,这就是面向对象六大原则相呼应了
面向对象六大原则

总结

在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

优点

  • 快速扩展
  • 完美体现开闭原则,对于扩展是开放的,对于修改是封闭的。

缺点

  • 会有很多产品类,增加代码量
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享