侧边栏壁纸
博主头像
三生石博主等级

梦想还是有的,就算做咸鱼,也要做最咸的。|

  • 累计撰写 39 篇文章
  • 累计创建 65 个标签
  • 累计收到 10 条评论

工厂模式

三生石
2022-09-09 / 0 评论 / 0 点赞 / 27 阅读 / 1,727 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-09-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

工厂模式

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

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

优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

简单工厂

提供一个统一的工厂类,由用户调用其 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();
    }
}
0

评论区