工厂模式

简单工厂模式

  • 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

  • 简单工厂模式是工厂模式家族中最简单实用的模式

  • 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)

  • 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.

  • 手机制造顶层接口

public interface Phone {
    void make();
}
  • 小米制造商

public class XiaoMiPhone implements Phone {
    @Override
    public void make() {
        System.out.println("制造了一台小米手机");
    }
}
  • 华为制造商

public class HuaWeiPhone implements  Phone{
    @Override
    public void make() {
        System.out.println("制造了一台华为手机");
    }
}
  • 手机制造代工厂(富士康)

public class PhoneFactory {
    public Phone makePhone(String phoneType){
        if ("xiaomi".equals(phoneType)){
            return new XiaoMiPhone();
        }else if ("huawei".equals(phoneType)){
            return new HuaWeiPhone();
        }
        return null;
    }
}
  • 用户需求方

public class TestMain {
    public static void main(String[] args) {
        PhoneFactory phoneFactory = new PhoneFactory();
        Phone xiaomi = phoneFactory.makePhone("xiaomi");
        xiaomi.make();
        Phone huawei = phoneFactory.makePhone("huawei");
        huawei.make();
    }
}
  • 类图如下所示

工厂方法模式

  • 和简单工厂模式相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,而不是由一个大工厂聚合生产

  • Phone 、XiaoMiPhone、HuaWeiPhone 类的不变

  • 新增抽象工厂类、小米工厂类、华为工厂类即可

  • 抽象工厂累

public interface AbstractFactory {
    Phone makePhone();
}
  • 小米工厂类

public class XiaoMiFactory implements AbstractFactory {
    @Override
    public Phone makePhone() {
        // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。
        // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。像简单工厂模式一一致
        return new XiaoMiPhone();
    }
}
  • 华为工厂类

public class HuaWeiFactory implements AbstractFactory{
    @Override
    public Phone makePhone() {
        // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。
        // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。像简单工厂模式一一致
        return new HuaWeiPhone();
    }
}
  • 用户需求方

public class TestMain {
    public static void main(String[] args) {
        AbstractFactory xiaoMiFactory = new XiaoMiFactory();
        AbstractFactory huaWeiFactory = new HuaWeiFactory();
        Phone xiaomi = xiaoMiFactory.makePhone();
        Phone huawei = huaWeiFactory.makePhone();
        xiaomi.make();
        huawei.make();
    }
}
  • 类图如下所示

抽象工厂模式

  • 定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类

  • 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。

  • 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)

  • 将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。

  • 上面的工厂模式都是在围绕手机在生产,如果这个时候,我们添加一个PC领域进去该如何玩呢?

  • 手机制造顶级接口

public interface Phone {
    void make();
}
  • 小米手机制造商

public class XiaoMiPhone implements Phone {
    @Override
    public void make() {
        System.out.println("制造了一台小米手机");
    }
}
  • 华为手机制造商

public class HuaWeiPhone implements Phone {
    @Override
    public void make() {
        System.out.println("制造了一台华为手机");
    }
}
  • 笔记本制造顶级接口

public interface PC {
    void make();
}
  • 小米笔记本制造商

public class XiaoMiPC implements PC{
    @Override
    public void make() {
        System.out.println("生产了一台小米笔记本");
    }
}
  • 华为笔记本制造商

public class HuaWeiPC implements PC{
    @Override
    public void make() {
        System.out.println("生产了一台华为笔记本");
    }
}
  • 代工厂顶级接口

public interface AbstractFactory {
    Phone makePhone();
    PC makePC();
}
  • 小米代工厂制造接口

public class XiaoMiFactory implements AbstractFactory {
    @Override
    public Phone makePhone() {
        // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。
        // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。想简答工厂模式一一致
        return new XiaoMiPhone();
    }
​
    @Override
    public PC makePC() {
        // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。
        // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。想简答工厂模式一一致
        return new XiaoMiPC();
    }
}
  • 华为代工厂制造接口

public class HuaWeiFactory implements AbstractFactory {
    @Override
    public Phone makePhone() {
        // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。
        // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。想简答工厂模式一一致
        return new HuaWeiPhone();
    }
​
    @Override
    public PC makePC() {
        // 这里的方式是:;若生产何种产品完全由工厂决定,则这里不应该传入控制生产的参数。
        // 如果消费者知道自己想要什么产品,可以入参,用参数来区别对待生产不同的产品。想简答工厂模式一一致
        return new HuaWeiPC();
    }
}
  • 需求方

public class TestMain {
    public static void main(String[] args) {
        AbstractFactory xiaoMiFactory = new XiaoMiFactory();
        AbstractFactory huaWeiFactory = new HuaWeiFactory();
        Phone xiaomi = xiaoMiFactory.makePhone();
        PC xiaomiPC = xiaoMiFactory.makePC();
        Phone huawei = huaWeiFactory.makePhone();
        PC huaweiPC = huaWeiFactory.makePC();
        xiaomi.make();
        xiaomiPC.make();
        huawei.make();
        huaweiPC.make();
    }
}
  • 类图如下所示

  • 此时,如果我们觉得手机和笔记本都已经玩腻了,想进军造车行业

    • 定义造成顶级接口

    • 定义造车品牌实现接口,比如小鹏汽车,蔚来汽车等

    • 此时增加代工顶级接口一个允许生产汽车的行为,并写一个汽车代工厂即可工厂

    • 扩展性就大大的增加了

工厂模式小结

  • 工厂模式的意义

    • 将实例化对象的代码提取出来,放到一个类中统一管理维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。

  • 三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式)

  • 设计模式的依赖抽象原则

    • 创建对象实例时,不要直接 new 类, 而是把这个 new 类的动作放在一个工厂的方法中,并返回

    • 不要让类继承具体类,而是继承抽象类或者是实现 interface(接口)

    • Ø 不要覆盖基类中已经实现的方法。

.

原文地址:https://www.cnblogs.com/msi-chen/p/14489242.html