今天来总结一下简单工厂模式,直接上个简单的类图吧。
从图中我们可以看到:
- 客户端如果想要一个 product1 ,它会给工厂说,我想要 1号产品 了你快看着办。
- 然后creator 也就是工厂就去车间给车间主任说,快给我生产一个 1 号产品。
- 然后车间主任就找了,最后一层层送回到客户端手中。
代码实现:
//接口类
public interface Iproduct {
// 接口只要一个方法,每一个product都得实现这个方法
public void doit();
}
// 一号产品类
public class Product1 implements Iproduct {
@Override
public void doit() {
System.out.println("创造product1成功!");
}
}
// 二号产品类
public class Product2 implements Iproduct {
@Override
public void doit() {
System.out.println("创造product2成功!");
}
}
// 3号产品类
public class Product3 implements Iproduct {
@Override
public void doit() {
System.out.println("创造product3成功!");
}
}
// 工厂类
public class Factory {
// 私有成员
private Iproduct product = null;
// 构造方法(判断客户端要几号产品)
public Factory(int n){
if(n == 1){
product = new Product1();
}else if(n == 2){
product = new Product2();
}else if(n == 3){
product = new Product3();
}else {
System.out.println("没有此产品!");
}
}
// 调用方法
void send(){
if(product != null){
product.doit();
}
}
}
// 客户端
public class Cilent {
// 主函数调用
public static void main(String[] args) {
Factory factory = new Factory(4); // 客户端想要一号产品了
factory.send(); // 工厂去做
}
}
简单工厂模式的优点:
- 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建对象的责任,而仅仅“消费”产品。
- 简单工厂模式通过这种方式实现了对责任的分割,它提供了专门的工厂类用于创建对象。
- 客户端无须知道所创建的具体产品的类名,只需要直到具体产品所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。简单来说就是:对于客户端来说,接口统一,只要传几个代表性的参数就可以调到想要的方法。
简单工厂模式的缺点:
如果要加一个新的 Product 就要修改creator 的代码,违反了开闭原则。