[设计模式]工厂模式

工厂模式一种创建型设计模式,可以为创建提供最优解。工厂模式又可细分为三种(简单工厂模式工厂方法模式抽象工厂模式)。

简单工厂模式

先看一个例子:

我们需要一辆自行车,自行车有很多种,可能时山地车、公路车或者普通自行车等等。

下面我们用简单工厂模式来实现这个获取一辆自行车的过程:
step 1 抽象类图:


image.png

step 2 代码实现(主要看工厂类):

package com.headfirst.factory;

public class BikeFactory {

    /**
     * @brief to produce a bike.
     * @param type
     * @return
     */
    static Bike produceBike(int type) {
        Bike bike;

        switch (type) {
        case 0: {/* produce a road bike. */
            bike = new RoadBike();
        }
        case 1: {/* produce a mountain bike. */
            bike = new MountainBike();
        }
        case 2: {/* produce a normal bike. */
            bike = new NormalBike();
        }
        default:/* default */
            bike = new NormalBike();
        }

        return bike;
    }
}

// 使用工厂类创建自行车对象:
RoadBike roadBike = (RoadBike)BikeFactory.produceBike(0);

该实现的核心就是Bike produceBike(int type){},所有Bike对象都通过Bike produceBike(int type){}来创建,这就是简单工厂模式

工厂方法模式

简单工厂模式不符合开闭原则,所以实际很少使用。工厂方法模式是对简单工厂模式的优化。
还是上面的例子,我们修改一下设计,将工厂类细分,不在通过传参来区分创建对象的类型,使其尽量符合开闭原则
step 1 抽象类图:

image.png

step 2 代码实现:

package com.headfirst.factory;

public abstract class BikeFactory {

    /**
     * @brief to produce a bike.
     * @param type
     * @return
     */
    abstract Bike produceBike(int type);
}

package com.headfirst.factory;

public class RoadBikeFactory extends BikeFactory {

    @Override
    Bike produceBike(void) {
        // TODO Auto-generated method stub
        return new RoadBike();
    }

}

package com.headfirst.factory;

public class MountainBikeFactory extends BikeFactory {

    @Override
    Bike produceBike(void) {
        // TODO Auto-generated method stub
        return new MountainBike();
    }

}

// 使用工厂类创建自行车对象:
RoadBike roadBike = (RoadBike)new RoadBikeFactory ().produceBike(0);

不同类型的自行使用不同的工厂类,这样不会频繁破坏工厂类的封装,这就是工厂方法模式

抽象工厂模式

抽象工厂模式的定义是:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

也就是说,抽象工厂模式工厂方法模式的区别是:

  • 工厂方法模式提供创建一个对象的接口
  • 抽象工厂模式提供创建一系列对象的接口
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容