Water2Wine

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

工厂模式可以分为普通工厂模式和抽象工厂模式

当碰到需要创建复杂对象的时候,可以使用工厂模式将对象的具体实现封装起来,用户只需要使用提供好的接口即可创建对象。

1. 普通工厂模式

步骤1

创建一个接口:

public interface car {
    void name();
}
步骤2

创建实现接口的实体类

public class Ferrari implements car {
    @Override
    public void name() {
        System.out.println("ferrari...");
    }
}

public class Porsch implements car {
    @Override
    public void name() {
        System.out.println("porsch...");
    }
}
步骤3

创建一个工厂,生成基于给定信息的实体类的对象

public class CarFactory {
    public car name(String s) {
        if (s.equals("porsch")) {
            return new Porsch();
        } else if (s.equals("ferrari")) {
            return new Ferrari();
        } else {
            return null;
        }
    }
}
步骤4

使用该工厂,通过传递类型信息来获取实体类的对象

public class Main {

    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();

        car ferrari = carFactory.name("ferrari");
        ferrari.name();
        car porsch = carFactory.name("porsch");
        porsch.name();
    }

}

2. 抽象工厂模式

普通工厂模式有一个问题,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?这就用到了抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改的代码。

抽象工厂类的本质其实就是把之前工厂类负责提供不同产品实现类的功能再抽象出来变成一个接口,分别创建不同的工厂类实现该接口返回不同产品,这样在扩展时只需要创建新的工厂类实现接口即可。

步骤1

创建产品的接口

public interface car {
    void name();
}

步骤2

创建产品实现类

public class Ferrari implements car {
    @Override
    public void name() {
        System.out.println("ferrari...");
    }
}

public class Porsch implements car {
    @Override
    public void name() {
        System.out.println("porsch...");
    }
}

步骤3

创建工厂的接口

public interface Producer {
    car produce();
}

步骤4

创建工厂实现类

public class FerrariFactory implements Producer {
    @Override
    public car produce() {
        return new Ferrari();
    }
}

public class PorschFactory implements Producer {
    @Override
    public car produce() {
        return new Porsch();
    }
}

步骤5

使用具体产品的工厂实现类获取实体类对象

public class Main {

    public static void main(String[] args) {
        Producer producer1 = new FerrariFactory();
        car ferrari = producer1.produce();
        ferrari.name();
        Producer producer2 = new PorschFactory();
        car porsch = producer2.produce();
        porsch.name();
    }

}
posted on 2020-06-21 17:18  Water2Wine  阅读(162)  评论(0编辑  收藏  举报