这是我参与更文挑战的第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();
    }
}
复制代码输出

通过代码可以看到,我们只需要传递我们想要生成的对象,或者type类型就可以获取到,并且执行对应的方法,如果后续需要扩展,则不用考虑些很多判断,这就是面向对象六大原则相呼应了
面向对象六大原则
总结
在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
优点
- 快速扩展
- 完美体现开闭原则,对于扩展是开放的,对于修改是封闭的。
缺点
- 会有很多产品类,增加代码量
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
    



















![[02/27][官改] Simplicity@MIX2 ROM更新-一一网](https://www.proyy.com/wp-content/uploads/2020/02/3168457341.jpg)


![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
