设计模式-创建型-工厂模式

122 阅读2分钟

简介

工厂模式是创建型模式的一种,也是里面需要注意的点最少的一种设计模式。通常来说,工厂模式有简单工厂、工厂方法和抽象工厂三种,其中前两种实现较为简单,后面一种比较复杂,这里先将简单工厂和工厂方法放一起,抽象工厂单独写一篇。

简单工厂

简单工厂适用于工厂类型确定的情况,在工厂中通过传入的类型来创建对应的对象。传统的写法如下(以创建各种水果为例): 1.首先定义水果的接口和方法:

public interface Fruit {
    String getType();
}

2.定义实现类(这里定义了Apple和pear)

public class Apple implements Fruit{
    @Override
    public String getType() {
        return "apple";
    }
}

public class Pear implements Fruit{
    @Override
    public String getType() {
        return "pear";
    }
}

3.定义一个跟图形映射的静态常量(非必须,本人习惯,这样可以避免魔鬼字符串,并且方便代码重构)

public interface Type {
    String APPLE = "apple";
    String PEAR = "pear";
}

4.定义图形工厂

public class FruitFactory {

    public static Fruit createFruit(String type) {
        if (type.equals(Type.PEAR)) {
            return new Pear();
        } else if (type.equals(Type.APPLE)) {
            return new Apple();
        }
        return null;
    }
}

5.客户端调用

public class Test {
    public static void main(String[] args) {
        Fruit fruit = FruitFactory.createFruit(Type.APPLE);
        System.out.println(fruit.getType());//apple

        Fruit fruit1 = FruitFactory.createFruit(Type.PEAR);
        System.out.println(fruit1.getType());//pear
    }
}

关于简单工厂

简单工厂应该是设计模式中最简单的一种,能满足一部分需求。该工厂最大的一个问题是违反了开闭原则,比如我现在要增加另一种水果,则必须在FruitFactory类中去增加,会修改这个类,我们辛辛苦苦加班写的代码,肯定是不想被别人去修改的。

工厂方法

如果简单工厂能满足我们的需求,就没有必要上工厂方法了,因为工厂方法会创建多个工厂,无疑增加了我们的维护成本。对于工厂方法,我们还是以创建水果为例,假设我们的苹果和梨有两种,分别时南方的和北方的,此时我们需要南方水果工厂来创建南方的水果,北方的水果工厂来创建北方的水果。步骤如下: 1.定义水果的接口:

public interface Fruit {
    String returnType();
}

2.定义南方和北方苹果和梨,实现Fruit接口

public class NorthApple implements Fruit{
    @Override
    public String returnType() {
        return "apple from north";
    }
}

public class NorthPear implements Fruit{
    @Override
    public String returnType() {
        return "pear from north";
    }
}

public class SouthApple implements Fruit{
    @Override
    public String returnType() {
        return "apple from south";
    }
}

public class SouthPear implements Fruit{
    @Override
    public String returnType() {
        return "pear from south";
    }
}

3.定义生产水果的工厂接口

public interface FruitFactory {
    Fruit createFruit(String type);
}

4.定义南方和北方的水果工厂,实现FruitFactory

public class NorthFruitFactory implements FruitFactory{
    @Override
    public Fruit createFruit(String type) {
        if (type.equals(Type.APPLE)) {
            return new NorthApple();
        } else if (type.equals(Type.PEAR)) {
            return new NorthPear();
        }
        return null;
    }
}

public class SouthFruitFactory implements FruitFactory{
    @Override
    public Fruit createFruit(String type) {
        if (type.equals(Type.APPLE)) {
            return new SouthApple();
        } else if (type.equals(Type.PEAR)) {
            return new SouthPear();
        }
        return null;
    }
}

5.客户端调用

public class Test {
    public static void main(String[] args) {
        FruitFactory fruitFactory = new SouthFruitFactory();
        Fruit fruit = fruitFactory.createFruit(Type.APPLE);
        System.out.println(fruit.returnType());//apple from south
        System.out.println("-----------------------------");
        FruitFactory fruitFactory1 = new NorthFruitFactory();
        Fruit fruit1 = fruitFactory1.createFruit(Type.PEAR);
        System.out.println(fruit1.returnType());//pear from north
    }
}