设计模式(三) 工厂方法模式

定义

定义一个用于创建对象的接口,让子类决定实例化那个类

UML类图

[图片上传失败...(image-72a8db-1517713140864)]

解读:

  • Product: 产品抽象类,
  • ConcreteProduct: 产品实现类
  • Creator: 工厂抽象类, 返回一个Product实例
  • ConcreteCreator: 工厂实现类, 返回一个ConcreteProduct实例

简单实现

Fruit: 作为产品抽象类

public abstract class Fruit {
    abstract void getName();
}

Banana: 作为产品实现类

public class Banana extends Fruit {
    @Override
    void getName() {
        System.out.println("I am banana");
    }
}

Apple: 作为产品实现类

public class Apple extends Fruit {
    @Override
    void getName() {
        System.out.println("I am apple");
    }
}

FruitFactory: 作为抽象工厂类

public abstract class FruitFactory  {
    abstract Fruit createFruit();
}

AppleFactory: 作为工厂实现类

public class AppleFactory extends FruitFactory {
    @Override
    Fruit createFruit() {
        return new Apple();
    }
}

BananaFactory: 作为工厂实现类

public class BananaFactory extends FruitFactory {
    @Override
    Fruit createFruit() {
        return new Banana();
    }
}

使用

在需要哪一个产品时就生产哪个

FruitFactory fruitFactory = new AppleFactory();
Fruit apple = fruitFactory.createFruit();
apple.getName();

使用反射

FruitFactory

public abstract class FruitFactory  {
    abstract <T extends Fruit> T createFruit(Class<T> className);
}

ConcreteFruitFactory: 具体工厂类

public class ConcreteFruitFactory extends FruitFactory {
    @Override
    <T extends Fruit> T createFruit(Class<T> className) {
        Fruit fruit = null;
        try {
            fruit = (Fruit)Class.forName(className.getName()).newInstance();
        }catch (Exception e){
            e.printStackTrace();
        }
        return (T)fruit;
    }
}

使用

需要哪个类对象就传入那个类的类型

       FruitFactory fruitFactory = new ConcreteFruitFactory();
       Fruit apple = fruitFactory.createFruit(Apple.class);
       apple.getName();

简单工厂方法模式

当工厂只有一个的时候, 只需将对应的工厂方法改为静态方法, 并去掉abstract关键字, 此时就变成了简单工厂模式或者静态工厂模式

public class FruitFactory  {
    static Fruit createFruit(){
        return new Apple();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容