JAVA 设计模式工厂方法模式

本文详细介绍了工厂方法模式的概念、应用场景及实现方式,并通过代码示例展示了如何使用该模式创建复杂对象。

工厂方法模式的介绍

工厂方法模式,是创建性设计模式之一,工厂方法模式是一种结构简单的模式,其在我们开发时应用很广泛

工厂方法模式的定义

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

工厂方法模式的使用场景

在任何需要生成复杂对象的地方,都可以使用工厂方法模式,复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式

工厂方法模式的UML图

下面我们用具体的例子来看

//抽象产品类
public abstract class Product {

    /**
     *产品类的抽象方法
     * 由具体的产品实现
     */
    public abstract String method();

}1234567891011复制代码
public  class ProductA extends Product{
    @Override
    public String method() {
       return "我是产品A";
    }
}123456复制代码
public class ProductB extends Product {
    @Override
    public String method() {
        return "我是产品B";
    }
}123456复制代码
public  abstract class Factory {

    /**
     * 抽象工厂方法
     * 具体生产什么由子类去实现
     * @return 具体的产品
     */
    public abstract Product createProduct();
}123456789复制代码
public class ProductFactory extends Factory {
    @Override
    public Product createProduct() {
        return new ProductB();
        //return new ProductA();
    }
}1234567复制代码
public class FactoryActivity extends BaseActivity {

    private TextView mTextView;

    @Override
    public int setMainView() {
        return R.layout.activity_factory;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mTextView = (TextView) findViewById(R.id.factory_text);
        ProductFactory productFactory = new ProductFactory();
        Product product = productFactory.createProduct();
        mTextView.setText(product.method());

    }
}12345678910111213141516171819复制代码

这里的几个角色都很简单,主要分为四大模块,一个是抽象工厂,其为工厂方法模式的核心,二是具体工厂,其实现了具体的业务逻辑,三是抽象产品,是工厂方法模式创建对象的父类,四是具体产品,为实现抽象产品的某个具体产品的对象

上述代码如果想要切换产品的话需要

public class ProductFactory extends Factory {
    @Override
    public Product createProduct() {
        return new ProductB();
        //return new ProductA();
    }
}1234567复制代码

这种方式比较常见,需要哪个产品就生产哪一个,有时候也可以利用反射跟简洁的来生产具体产品对象,此时需要传入一个Class来决定是哪一个产品类,代码如下

public class ProductFactory extends Factory {

    @Override
    public <T extends Product> T createProduct1(Class<T> cls) {
        Product p= null;
        try {
            p = (Product) Class.forName(cls.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) p;
    }
}12345678910111213复制代码

调用

public class FactoryActivity extends BaseActivity {

    private TextView mTextView;

    @Override
    public int setMainView() {
        return R.layout.activity_factory;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mTextView = (TextView) findViewById(R.id.factory_text);
        ProductA productA = new ProductA();
        ProductFactory productFactory1 = new ProductFactory();
        ProductA product1 = productFactory1.createProduct1(productA.getClass());
        mTextView.setText(product1.method());

    }
}1234567891011121314151617181920复制代码

除了上面两种之外还可以为每个具体的产品,定义一个具体的工厂,这样的成为多工厂模式,这里就不过多的叙述了

总结:

总的来说,工厂方法模式是一个很好的实际模式,在本文多处地方都有对其有点的总结,但是缺点也是难以避免的,每次我们为工厂方法模式添加新的产品时就要编写一个新的产品类,同时还要引入抽象层,这必然导致类结构的复杂化,所以说,在某些情况比较简单时,是否需要使用工厂模式,需要权衡利弊。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值