装饰模式的本质是:选择实现。
一、简单工厂模式的定义:
提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
严格来说,简单工厂并不属于23类设计模式,但是它小巧,灵活,在代码中也被大量使用。
一、应用场景
1)想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选择用简单工厂,让客户端通过工厂来获取相应的接口,而无须关心具体的实现;
2)如果想要把对象的职责集中管理和控制,可以选择用简单工厂,一个简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂来,从而实现集中管理和控制。
三、代码示例
假设有一个水果工厂,生产各种水果,代码如下:
1、水果接口
public interface Fruit {
void print();
}
2、各种水果
// 苹果
public class Apple implements Fruit {
@Override
public void print() {
System.out.println("it's an apple");
}
}
// 香蕉
public class Banana implements Fruit {
@Override
public void print() {
System.out.println("it's a banana");
}
}
// 橘子
public class Orangle implements Fruit {
@Override
public void print() {
System.out.println("it's an orangle");
}
}
// 梨子
public class Pear implements Fruit {
@Override
public void print() {
System.out.println("it's a pear");
}
}
3、水果工厂
public class FruitFactory {
public static Fruit getFruitMethod1(Class<? extends Fruit> clzz) {
try {
return clzz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
4、客户端
public class Client {
public static void main(String[] args) {
Apple apple = (Apple) FruitFactory.getFruitMethod1(Apple.class);
apple.print();
Orangle orangle = (Orangle) FruitFactory.getFruitMethod1(Orangle.class);
orangle.print();
Banana banana = (Banana) FruitFactory.getFruitMethod1(Banana.class);
banana.print();
Pear pear = (Pear) FruitFactory.getFruitMethod1(Pear.class);
pear.print();
}
}
四、简单工厂的优缺点
优点
1)帮助封装;
2)解耦。
缺点
1)可能增加客户端的复杂度。
如果是采用客户端参数来选择具体的实现类,那么必须让客户端理解各个参数的具体含义,这会增加客户端选择的难度,也在一定程度上暴露了内部实现的一些细节。