1、简单介绍

工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式。该模式用于封装和管理对象的创建,是一种创建型模式。

2、简单工厂模式

下面我们使用手机生产来讲解该模式:

  • 定义手机标准规范类

    1. public interface Phone {
    2. void make();
    3. }
  • 定义具体实现类

    1. public class MiPhone implements Phone {
    2. public MiPhone() {
    3. this.make();
    4. }
    5. @Override
    6. public void make() {
    7. System.out.println("造小米手机");
    8. }
    9. }
    10. public class IPhone implements Phone {
    11. public IPhone() {
    12. this.make();
    13. }
    14. @Override
    15. public void make() {
    16. System.out.println("造苹果手机");
    17. }
    18. }
  • 手机代工厂

    1. public class PhoneFactory {
    2. public Phone makePhone(String phoneType) {
    3. if (phoneType.equalsIgnoreCase("MiPhone")) {
    4. return new MiPhone();
    5. } else if (phoneType.equalsIgnoreCase("iPhone")) {
    6. return new IPhone();
    7. }
    8. return null;
    9. }
    10. }
  • 测试

    1. public class PhoneDemo {
    2. public static void main(String[] arg) {
    3. PhoneFactory factory = new PhoneFactory();
    4. // 造小米
    5. Phone miPhone = factory.makePhone("MiPhone");
    6. // 造苹果
    7. IPhone iPhone = (IPhone)factory.makePhone("iPhone");
    8. }
    9. }

    image.png

    3、工厂方法模式

    和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂。

  • 定义工厂抽象类

    1. public interface AbstractFactory {
    2. Phone makePhone();
    3. }
  • 定义工厂实现类

    1. public class XiaoMiFactory implements AbstractFactory {
    2. @Override
    3. public Phone makePhone() {
    4. return new MiPhone();
    5. }
    6. }
    7. public class AppleFactory implements AbstractFactory {
    8. @Override
    9. public Phone makePhone() {
    10. return new IPhone();
    11. }
    12. }
  • 测试

    1. public class demo {
    2. public static void main(String[] arg) {
    3. // 小米工厂造小米
    4. AbstractFactory miFactory = new XiaoMiFactory();
    5. miFactory.makePhone();
    6. // 苹果工厂造苹果
    7. AbstractFactory appleFactory = new AppleFactory();
    8. appleFactory.makePhone();
    9. }
    10. }

    image.png