设计模式之工厂模式

157 阅读5分钟

1、工厂模式的作用

工厂模式是用来创建对象的。但是,创建可以用new创建对象,为什么要用工厂模式呢?比如说我们创建一个Phone对象。

Phone phone = new Phone ();

看上去并没有什么不妥的地方啊,平常也一直这样写代码的。但是我们想想工作中如果Phone创建的时候要传入一个对象,那么代码可以写成这样

Phone phone = new Phone (context);

如果再加一个呢?

Phone phone = new Phone (context,tag1...);

如果这样说,并不麻烦啊,构造参数加就可以了。但是这只是一个简单的问题。如果我们在new的时候做一些操作呢?比如加上赋值,查询操作,甚至是调用比较复杂的代码,那么我们就得把每一个new的地方都得修改。这样的话,工作量是很大的。况且我们不能预测将来还会有什么改变。因此把new对象交给别人是非常重要的事情。另外,使用 new 来创建对象本身也是一种耦合的代码,一处的变动可以影响到多个模块的使用(构造方法变动,调用的变动)。代码设计的规范一定要减少耦合度,这样才容易维护。

 工厂模式的主要作用: 1、创建对象 2、代码解耦,模块化。 3、减少对象变动时带来的工作量,容易维护。

2、简单工厂模式

使用步骤:

1、创建抽象产品类 & 定义具体产品的公共接口; 

2、创建具体产品类(继承抽象产品类) & 定义生产的具体产品;

3、创建工厂类,通过创建静态方法根据传入不同参数从而创建不同具体产品类的实例; 

4、外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例。

// 创建抽象产品类
abstract class Phone {
    public Phone(){
    }
}

// 创建具体产品类
public class Androidphone extends Phone {
    public Androidphone() {
        System.out.println("安卓手机");
    }
}

public class Iosphone extends Phone {
    public Iosphone() {
        System.out.println("苹果手机");
    }
}

工厂类,工厂中根据不同的类型,生产不同的手机

public class Factory {
    public Phone creatPhone(int type) {
        switch (type) {
            case 1:
                return new Iosphone();
            case 2:
                return new Androidphone();
            default:
                break;
        }
        return null;
    }
}

测试类

public class SimpleFactoryTest {
    public static void main(String[] args) {
        Factory factory = new Factory();
        factory.creatPhone(1);
        factory.creatPhone(2);
    }
}

3、工厂方法模式

在简单工厂模式中工厂类需要知道每个产品的实现细节,每当有新产品加入时必须更新工厂类,加入必要的业务逻辑,违反了开闭原则,没办法做到灵活扩展。

工厂方法模式中,工厂类变成了一个抽象接口,不再负责所有产品的创建,而是将具体产品的创建工作交给子类去完成。

使用步骤:

1、创建抽象工厂类,定义具体工厂的公共接口; 

2、创建抽象产品类 ,定义具体产品的公共接口; 

3、创建具体产品类(继承抽象产品类) & 定义生产的具体产品; 

4、创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法; 

5、外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例。

3.1、产品类

//抽象产品类
abstract class Phone {
    public Phone(){
    }
}

//具体产品:安卓手机
public class Androidphone extends Phone {
    public Androidphone() {
        System.out.println("im android phone");
    }
}

//具体产品:苹果手机
public class Iosphone extends Phone {
    public Iosphone() {
        System.out.println("im ios phone");
    }
}

3.2、工厂类

定义一个用于创建对象的接口,由子类去具体决定要实例化哪个类。从而使一个类的实例化延迟到其子类。

//抽象工厂类
public interface FactoryPhone {
    Phone createPhone();
}

//具体的工厂类:安卓手机
public class FactoryAndroid implements FactoryPhone {
    @Override
    public Phone createPhone() {
        return new Androidphone();
    }
}

//具体工厂类:苹果手机
public class FactoryIos implements FactoryPhone {
    @Override
    public Phone createPhone() {
        return new Iosphone();
    }
}

3.3、测试类

public class FactivityTest {
    public static void main(String[] args) {
        //生产安卓手机
        FactoryAndroid android = new FactoryAndroid();
        android.createPhone();
        //生产苹果手机
        FactoryIos ios = new FactoryIos();
        ios.createPhone();
    }
}

4、抽象工厂模式

与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品,这些产品构成了一个产品族。

4.1、产品类

//抽象产品类
abstract class Phone {
    public Phone(){
    }
}

//具体产品:安卓手机
public class Androidphone extends Phone {
    public Androidphone() {
        System.out.println("im android phone");
    }
}

//具体产品:苹果手机
public class Iosphone extends Phone {
    public Iosphone() {
        System.out.println("im ios phone");
    }
}

4.2、工厂类

抽象工厂,抽象出所创建的对象

abstract class AbstractFactory {
    abstract Androidphone getAndroid();
    abstract Iosphone getIos();
}

具体工厂,抽象工厂的具体实现

public class PhoneFactory extends AbstractFactory {
    @Override
    public Androidphone getAndroid() {
        return new Androidphone();
    }

    @Override
    public Iosphone getIos() {
        return new Iosphone();
    }
}

4.3、测试

public class AbstractFactivityTest {
    public static void main(String[] args) {
        PhoneFactory phoneFactory=new PhoneFactory();
        phoneFactory.getAndroid();
        phoneFactory.getIos();
    }
}

总结:

简单工厂模式:在简单工厂中直接根据所有创建的产品类型不同,来new不同的对象,从同一个工厂中可以生产出android,ios类型的手机。 

工厂方法模式:把简单工厂模式中的工厂职能分离,android工厂创建android类型手机,ios工厂创建ios类型的手机。 

抽象工厂模式:把所要创建的手机抽象到工厂中,产生一个抽象工厂,在这个工厂的实现中,创建所需求的手机。 

看了上面的解释,这三种工厂在什么情况下使用呢? 在一般情况下:简单工厂和工厂模式都可以满足我们的使用需求,工厂模式其实是简单工厂模式的一种更加解耦的方式。

在实际中比较适合这种创建不同对象的工厂:比如说,这个工厂生产手机:一种类型的苹果手机,一种类型的安卓手机(注意是一种类型手机) 抽象工厂是用来给我们更复杂的场景使用的,这个对象创建可能比较复杂,工厂中创建的可能只是这一系列的产品,而不具体的产品,比如 这个工厂生产手机,生产苹果和安卓手机,但苹果(iphone6,7)android(华为,小米…)