设计模式(二)、工厂模式--工厂方法模式

工厂方法模式是一种常用的创建型设计模式。它解决了简单工厂模式的问题:如违反了开闭原则,其次可以用于更复杂的结构

它的核心结构有四个角色  抽象工厂;具体工厂;抽象产品;具体产品

抽象工厂(抽象类或接口)不在负责具体的创建过程,即具体的代码实现。只制定了规范,具体的实现将由具体的工厂去实现。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
 

工厂方法模式(Factory Method pattern)是最典型的模板方法模式的应用

代码示例如下:

定义一个抽象工厂类:

/**
 * 蛋糕工厂类
 * 定义蛋糕工厂类 该类主要是定义了createCake抽象方法,
  并且在无参构造函数中进行调用,具体的实现是在子类里进行实例化的
 */
public abstract class CakeFactory {

    abstract Cake createCake();

    public CakeFactory() {
        createCake();
    }
}

定义具体的工厂类:

/**
 * @desc: 苹果蛋糕工厂类类
 */
public class AppleCakeFactory extends CakeFactory{

    @Override
    public Cake createCake() {
        return new AppleCake();
    }
}
/**
 * @desc: 香蕉蛋糕工厂类
 */
public class BananaCakeFactory extends CakeFactory{
    @Override
    public Cake createCake() {
        return new BananaCake();
    }
}

定义抽象产品类:

/**
 * 蛋糕父类
 */
public abstract class Cake {
}

定义具体的产品类:

/**
 * 苹果蛋糕
 */
public class AppleCake extends Cake {
    public AppleCake(){
        System.out.println("创建了苹果蛋糕实例");
    }
}
/**
 * 香蕉蛋糕
 */
public class BananaCake extends Cake {
    public BananaCake(){
        System.out.println("创建了香蕉蛋糕实例");
    }
}

测试类

/**
 * 测试类
 */
public class Test {
    public static void main(String[] args) {
        AppleCakeFactory appleCakeFactory = new AppleCakeFactory();

        BananaCakeFactory bananaCakeFactory = new BananaCakeFactory();
    }
}

工厂方法经常用在以下两种情况中:

第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。java Collection中的iterator() 方法即属于这种情况。

第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,这个决策过程对生产者来说是透明的。

你可能感兴趣的:(设计模式,设计模式,工厂方法模式)