每天一个设计模式(二)简单工厂模式和工厂方法模式

1,054 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

工厂模式也是属于创建型模式的一种,用于创建实例,而这些实例是有相同行为,这些行为在不同类型的实例上具体表现不同。例如苹果和香蕉都属于水果,它们都有颜色属性,而他们的颜色是不同的。当我们在不同条件或者场景下需要创建不同的实例时就要考虑是否可以使用工厂模式。而工厂模式又分为简单工厂模式,工厂方法模式,抽象工厂模式,下面一一了解下简单工厂模式和工厂方法模式的写法。

简单工厂模式

简单工厂模式调用方不会知道如何创建实例,它只需要告知创建什么实例即可。

写法

  1. 创建一个接口Fruit,写明抽象方法color用以返回水果颜色:
public interface Fruit {
	String color();
}
  1. 创建Apple和Banana类实现Fruit接口,重新color方法,返回自身的颜色。
public class Apple implements Fruit{
	@Override
	public String color() {
		return "red";
	}
}
public class Banana implements Fruit{
	@Override
	public String color() {
		return "yellow";
	}
}
  1. 创建工厂类,用以根据不同参数返回不同实例。
public class FruitFactory {
	Fruit getFruit(String name) {
		if(name.equals("apple")) {
			return new Apple();
		}
		if(name.equals("banana")) {
			return new Banana();
		}
		return new Apple();
	}
}
  1. 使用工厂类进行调用,获取不同的实例。
FruitFactory factory = new FruitFactory();
Fruit apple = factory.getFruit("apple");
Fruit banana = factory.getFruit("banana");
System.out.println("apple:" + apple.color());
System.out.println("banana:" + banana.color());

运行结果:

apple:red
banana:yellow

工厂方法模式

与简单工厂模式不同的是工厂方法模式需要创建工厂接口,然后不同Fruit各创建一个工厂去实现这个接口使得一个类的实例化延迟到子类。

写法

  1. 创建工厂接口,声明创建实例方法createFruit()
public interface Factory {
    Fruit createFruit();
}
  1. 分别创建Apple和Banana两个实例的工厂类实现工厂接口。
public class AppleFactory implements Factory{
    @Override
    public Fruit createFruit() {
        return new Apple();
    }
}
public class BananaFactory implements Factory{
    @Override
    public Fruit createFruit() {
        return new Banana();
    }
}
  1. 分别实例化Apple和Banana的工厂调用createFruit方法获取实例。
Factory appleFactory = new AppleFactory();
Factory bananaFactory = new BananaFactory();
System.out.println("apple:" + appleFactory.createFruit().color());
System.out.println("banana:" + bananaFactory.createFruit().color());

简单工厂模式和工厂方法模式的区别

  • 简单工厂模式调用端直接通过传递不同实例类型来获取实例,工厂模式方法中将一个类的实例化延迟到子类。
  • 工厂方法模式把实例化的逻辑移动到了调用端,也就是调用端要选择使用AppleFactory还是BananFactory来创建实例。这样当增加一个水果类型时,不仅要创建一个水果类,还需要额外创建一个水果工厂类。

设计模式上一篇:单例模式