15、简单工厂模式
简单工厂模式是由一个工厂对象决定创建出哪一种产品的实例。简单工厂模式是工厂模式家族中最简单的实用模式。
如果没有工厂模式情况下,我们需要用一个对象的话,我们要这样去用:
public class Demo1
{
public static void main(String[] args)
{
//我们想要用下面两个产品:用父类的引用指向子类的引用
Prodect phone = new Phone();
phone.work();
}
}
interface Prodect
{
public void work();
}
//然后我们有好几个不同的产品:
class Phone implements Prodect
{
public void work()
{
System.out.println("手机开始工作...");
}
}
class Computer implements Prodect
{
public void work()
{
System.out.println("电脑开始工作...");
}
}
/*
结果:
手机开始工作...
*/
但是,我们有没有能用更好的方式来实现这样的方法呢?
我们可以看到,在Demo1中,new了一个Phone类,意思就是说,Demo1类跟Phone类相互依赖。以来有什么后果呢,如果Phone类发生了变化,Demo1中的Phone类就会被报错。这时候就有了工厂模式,使用工厂模式来降低两者之间的依赖。下面的工厂类就是降低依赖的方式,然后改一下声明的主函数就行了:
public class Demo1
{
public static void main(String[] args)
{
//我们想要用下面两个产品:用父类的引用指向子类的引用
//Prodect phone = new Phone();
Prodect phone = ProductFactory.getProduct("phone");
phone.work();
Prodect computer = ProductFactory.getProduct("computer");
computer.work();
Prodect abc = ProductFactory.getProduct("abc");
abc.work();
}
}
interface Prodect
{
public void work();
}
//然后我们有好几个不同的产品:
class Phone implements Prodect
{
public void work()
{
System.out.println("手机开始工作...");
}
}
class Computer implements Prodect
{
public void work()
{
System.out.println("电脑开始工作...");
}
}
//所以我们加入一个工厂类:
class ProductFactory
{
public static Prodect getProduct(String name)//这里要加上静态static,不然主函数无法引用
{
if("phone".equals(name))
{
return new Phone();
}
else if("computer".equals(name))
{
return new Computer();
}
else
{
return null;
}
}
}
/*
结果:
手机开始工作...
电脑开始工作...
Exception in thread "main" java.lang.NullPointerException
at Demo1.main(Demo1.java:12)
*/
我们可以看第11行,由于没有类是abc,所以在输出时,会出现空指针错误。