多态的应用——简单工厂模式

在之前的博客,我们我们谈到过Java的三大特性之一——多态,这里我们来具体来看看Java多态特性的应用简单工厂模式

多态的应用——简单工厂模式_第1张图片

首先我们先来看一个例子

public interface Product {
    void work();
}
public class Phone implements Product {
    @Override
    public void work() {
        System.out.println("电话可以用来打电话...");
    }
}
public class Computer implements Product {
    @Override
    public void work() {
        System.out.println("电脑可以用来上网...");
    }
}
public class Client {
    public static void main(String[] args) {
        Product product= new Computer();
        product.work();
    }
}

上述代码很简单,我们也能轻易发现其中的问题,就是场景类和Computer耦合过高,要是Computer类改动了,Client类也会产生影响,所以我们就想用一个类来专门为我们生产产品。

public class ProductFactory {
    public static Product getProduct(String type){
        switch (type){
            case "phone":
                return new Phone();
            case "computer":
                return new Computer();
            default:
                return null;
        }
    }
}

其中getProduct方法使用static,方便我们可以直接可以使用类名调用,所以也可以称为静态工厂模式,另外场景类也做出相应的改变

public class Client {
    public static void main(String[] args) {
        Product product = ProductFactory.getProduct("phone");
        if (product != null) {
            product.work();
        }
    }
}

不过可能还是有同学认为,工厂里的方法太过麻烦,每次添加一个新的产品,都需要改变ProductFactory类,其实我们也可以使用反射进行实例化。

public class ProductFactory<T> {
    public static <T extends Product> T getProduct(Class<T> clazz){
        T product = null;
        try {
            product = (T) Class.forName(clazz.getName()).newInstance();
        } catch (Exception e) {
            System.out.println("产品生产失败!");
        }
        return product;
    }
}
public class Client {
    public static void main(String[] args) {
        Product product = ProductFactory.getProduct(Phone.class);
        if (product != null) {
            product.work();
        }
    }
}

你可能感兴趣的:(设计模式)