《JAVA设计模式系列》浅谈工厂模式

本文详细介绍了工厂模式的四种类型:简单工厂、工厂方法、抽象工厂,以及它们在实际应用中的示例。简单工厂提供静态方法创建对象,而工厂方法则将创建对象的责任分配给子类。抽象工厂则用于创建相互有关联的一系列对象,例如在不同平台下创建枪支和子弹。这些模式有助于解耦代码,提高可维护性和扩展性。
摘要由CSDN通过智能技术生成

工厂模式

在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。

除了解耦合,把对象的创建和使用的过程分开。工厂模式批量生产对象,还能有效降低代码重复,在业务逻辑发生变化时降低维护成本。 在开源框架中的使用很多,比如 Spring 框架中通过 getBean 方法获取 Bean 。

简单工厂

提供一个统一的工厂类,由用户调用其 static 方法来创建对象。可以根据用户输入参数来返回相应的对象。

public class ShapeFactory {

    public static Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        } else if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        }
        return null;
    }
}
Shape circle = ShapeFactory.getShape("CIRCLE");

如果我们新增产品类的话,就需要修改工厂类中的 getShape 方法。这个弊端可以通过反射机制改善。

public class ShapeFactory {
    public static Object getShape(Class<? extends Shape> c) {
        Object obj = null;

        try {
            obj = Class.forName(c.getName()).newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return obj;
    }
}
Circle circle = (Circle) ShapeFactory2.getClass(factory_pattern.Circle.class);

工厂方法

工厂方法模式是简单工厂的仅一步深化。在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说 每个对象都有一个与之对应的工厂 。

// 工厂接口
public interface Factory {
    public Shape getShape();
}
// 专用工厂类,还可以有其他工厂类
public class CircleFactory implements Factory {
    @Override
    public Shape getShape() {
        return new Circle();
    }
}

抽象工厂

工厂方法模式中专用工厂类只生产单一产品。如果需要生产相互是有关系或有依赖的整套产品,就使用抽象工厂。

public interface Factory {
    public Gun produceGun();
    public Bullet produceBullet();
}

public class AKFactory implements Factory{
    @Override
    public Gun produceGun() {
        return new AK();
    }
    @Override
    public Bullet produceBullet() {
        return new AK_Bullet();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值