提出问题
从面向对象设计原则可以知道,我们应该面相接口编程。
看下面示例:
public interface People {
public void walk();
public void say();
public class Student implements People{
@Override
public void walk() {
System.out.println("优雅地行走");
}
@Override
public void say() {
System.out.println("Hello");
}
}
public class InterfaceTest {
public static void main(String[] args) {
People stu = new Student();
stu.say();
stu.walk();
}
}
上面写的没错,在java基础里面就是这么学的,但是仔细看看下面这句话:
People stu = new Student();
客户端调用的时候,客户端不但知道了接口,同时还知道了具体的实现就是Student;接口的思想是封装隔离,而实现类Student应该是被接口People封装并同客户隔离开的,也就是说客户端根本不应该具体的实现类是Student.
解决问题
对于上述问题,我们可以用简单工厂来解决。
简单工厂:提供一个创建对象实例的功能,而无需关心其实现。被创建实例的类型可以是接口,抽象类,也可以是具体的类。
简单工厂实例代码:
public class Factory {
public static People getInstance(int type) {
People people = null;
switch(type) {
case 1:
people = new Student();
}
return people;
}
}
//使用方式
public class FactoryTest {
public static void main(String[] args) {
People p = Factory.getInstance(1);
p.walk();
p.say();
}
}
注意事项:
如果要防止客户端无谓的创造简单工厂实例,还可以吧简单工厂的构造方法私有化。