美文网首页
设计模式之工厂方法模式

设计模式之工厂方法模式

作者: 超级大鸡腿 | 来源:发表于2018-11-20 23:16 被阅读0次

工厂方法模式 :定义一个用于创建对象的接口,让子类决定实现哪一个类,工厂方法使一个类的实例化延迟到其子类。

工厂模式的基本组成:

1、抽象工厂

所有具体工厂的父类,规范子类

2、具体工厂

创建某种客户端需要的实现类对象

3、抽象的需要创建对象父类

是根据客户需要创建的对象的父类

4、具体创建对象

客户端需要的实现类对象

还是取简单工厂模式的例子为例

抽象工厂

package factory;

/**

* Created by canon on 2018/11/13.

*/

public interface FruitFactory {

    Fruit createFruit();

}

具体工厂

苹果工厂

package factory;

/**

* Created by canon on 2018/11/20.

*/

public class AppleFactory implements FruitFactory {

    @Override

    public Fruit createFruit() {

        return new Apple();

    }

}

香蕉工厂

package factory;

/**

* Created by canon on 2018/11/20.

*/

public class BananaFactory implements FruitFactory {

    @Override

    public Fruit createFruit() {

        return new Banana();

    }

}

抽象的需要创建对象父类

package factory;

/**

* Created by canon on 2018/11/13.

*/

public interface Fruit {

    String getFruitName();

    String getFruitColor();

    double getFruitWeight();

}

具体创建对象

苹果类

package factory;

/**

* Created by canon on 2018/11/13.

*/

public class Apple implements Fruit {

    @Override

    public String getFruitName() {

        return "苹果";

    }

    @Override

    public String getFruitColor() {

        return "红色";

    }

    @Override

    public double getFruitWeight() {

        return 0.5;

    }

}

香蕉类

package factory;

/**

* Created by canon on 2018/11/13.

*/

public class Banana implements Fruit {

    @Override

    public String getFruitName() {

        return "香蕉";

    }

    @Override

    public String getFruitColor() {

        return "黄色";

    }

    @Override

    public double getFruitWeight() {

        return 0.5;

    }

}

客户点调用

package controller;

import factory.AppleFactory;

import factory.BananaFactory;

import factory.Fruit;

import factory.FruitFactory;

/**

* Created by canon on 2018/11/20.

*/

public class FactoryDesignPattern {

    public static void main(String[] args) {

        //我需要苹果

        FruitFactory fruitFactory = new AppleFactory();

        Fruit apple = fruitFactory.createFruit();

        System.out.println(apple.getFruitColor());

        System.out.println(apple.getFruitName());

        System.out.println("------------------------------------");

        //我需要香蕉

        fruitFactory = new BananaFactory();

        Fruit banana = fruitFactory.createFruit();

        System.out.println(banana.getFruitName());

        System.out.println(banana.getFruitColor());

    }

}

输出如下

红色

苹果

------------------------------------

香蕉

黄色

Process finished with exit code 0

创建对象的创建不在交给核心的抽象工厂,而是由具体的工厂类去创建对象。使得原先简单工厂模式由于创建对象需要if。。else。。等的逻辑会带来违背开闭原则的问题得到解决,每当有新的对象需要生成,不需要影响原有的代码,只需要新创一个工厂子类以及新的对象即可。对于客户端,不需要关心具体实现逻辑,只关心调用的接口。当然同样的,也不免有缺点,当新的对象越来越多的时候,相应工厂的类也会越来越多,增加了系统的复杂性。

相关文章

网友评论

      本文标题:设计模式之工厂方法模式

      本文链接:https://www.haomeiwen.com/subject/nabfqqtx.html