【设计模式】之【工厂方法模式】

【设计模式】



前言

在实际开发过程中,有些情况下会遇到需要创建有共同类型的对象,而且对象之间又有一些共同的属性与行为。比如猫和狗,都是哺乳动物,同时邮箱相同的属性4条腿。


一、简单工厂

简单工厂不是设计模式,而是一种开发习惯。
在创建对象过程中通过某一个类型来区分不同的对象,从而创建出需要的对象。

例如

共同的行为 Product

package com.wwh.designModel.simpleFactory;

public interface Product {
    public void method();
}

每一个对象都去具体实现行为

public class ProductA implements Product {
    @Override
    public void method() {
        System.out.println("ProductA method!");
    }
}

public class ProductB implements Product {
    @Override
    public void method() {
        System.out.println("ProductB method");
    }
}

根据类型来创建需要的对象

package com.wwh.designModel.simpleFactory;

public class SimpleFactory {

    private Product createProduct(String type) {
        if (type.equals("0")) {
            return new ProductA();
        } else if (type.equals("1")) {
            return new ProductB();
        } else {
            return null;
        }
    }

    public Product getObject(String type) {
        return createProduct(type);
    }
}

测试案例
package com.wwh.designModel.simpleFactory;

public class test {

public static void main(String[] args) {
    SimpleFactory simpleFactory = new SimpleFactory();
    Product product = simpleFactory.getObject("1");
    product.method();
}

}

二、工厂方法模式

工厂方法模式对比简单工厂大致相同,不同点在于对象的创建上,将获取对象的共同点保留,创建对象的不同点留给子类去具体实现。

例如

共同的行为 Product

package com.wwh.designModel.simpleFactory;

public interface Product {
    public void method();
}

每一个对象都去具体实现行为

public class ProductA implements Product {
    @Override
    public void method() {
        System.out.println("ProductA method!");
    }
}

public class ProductB implements Product {
    @Override
    public void method() {
        System.out.println("ProductB method");
    }
}

使用抽象类将相同行为实现,不同点留给子类去具体实现

package com.wwh.designModel.factoryMethod;
 public abstract class AbstractFactory {

     public abstract Product createProduct();

     public Product getObject() {
         return createProduct();
     }
}

子类具体实现

package com.wwh.designModel.factoryMethod;

public class FactoryProductA extends AbstractFactory {
    @Override
    public Product createProduct() {
        return new ProductA();
    }
}

package com.wwh.designModel.factoryMethod;

public class FactoryProductB extends AbstractFactory {
    @Override
    public Product createProduct() {
        return new ProductB();
    }
}

测试案例

package com.wwh.designModel.factoryMethod;

public class test {

    public static void main(String[] args) {
        AbstractFactory abstractFactory = new FactoryProductA();
        Product product = abstractFactory.getObject();
        product.method();
    }
}

总结

在实际开发的过程中,如果对象种类不是很多的话,其实使用简单工厂就可以应对了。但是一旦后续还有种类要增加的话就涉及到需要更改旧代码,引来未知的风险。而使用工厂方法模式的话就避免了以上的问题,有新的种类增加,就只需要增加一个子类实现即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值