静态工厂模式
引言
追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory 工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。
正文
工厂模式是我们最常见的实例化对象的模式了,它可以使开发者在实例化对象的时候省去**new()**这一步,需要什么类的实例就可以去创建一个。工厂模式属于创建型模式之一。
应用实例
我想吃一个水果,直接去工厂里去拿即可,二不用管这个水果是从哪里种的,以及是如何浇水施肥的,只需要告诉工厂你是想吃苹果还是梨子即可。
具体步骤
步骤1
创建一个水果的抽象类:
public abstract class Fruit {
public abstract void eat();
}
复制代码
步骤2
创建继承抽象类的实体类:
苹果类:
public class Apple extends Fruit {
@Override
public void eat() {
System.out.println("I wanna an apple");
}
}
复制代码
香蕉类:
public class Banana extends Fruit {
@Override
public void eat() {
System.out.println("I wanna a banana");
}
}
复制代码
梨子类:
public class Pear extends Fruit {
@Override
public void eat() {
System.out.println("吃一个梨");
}
}
复制代码
步骤3
创建一个工厂,使其可以根据传递过来的参数来实例化相应的对象。
public class FruitFactory {
public static Fruit createFruit(String type) {
Fruit mFruit = null;
switch (type) {
case "Apple":
mFruit = new Apple();
break;
case "Banana":
mFruit = new Banana();
break;
case "Pear":
mFruit = new Pear();
break;
default:
break;
}
return mFruit;
}
}
复制代码
步骤4
用户使用该工厂:
public class EatFruit {
public static void main(String[] args) {
// TODO Auto-generated method stub
FruitFactory.createFruit("Apple").eat();
FruitFactory.createFruit("Banana").eat();
FruitFactory.createFruit("Pear").eat();
}
}
复制代码
总结
使用场景
所需要创建的类的数量不是很多的场景下,可以考虑使用静态工厂模式。
优缺点
优点
- 静态工厂可以根据用户传入的参数来动态地实例化对象,避免一次性实例化所有对象所带来的性能浪费,同时也降低了耦合性。
缺点
- 每多增加一个产品类,都需要增加一个额外的具体产品类和该类的实现工厂,这很明显地违背了开闭原则,增加了系统的复杂度。此外,这种“牵一发而动全身”的写法,很容易使系统出错。