俗话说得好:贪多嚼不烂,前些天就是一下子把几个工厂模式都看完,结果导致理解跟不上,没有及时写下总结。
现在吸取教训,先将简单工厂模式总结一下,然后再继续说工厂模式、抽象工厂模式以及单例模式(之前半天将这些模式看完,自以为理解了,结果眼睛一闭一睁,都忘了)
=========贪多嚼不烂========贪多嚼不烂========贪多嚼不烂============
下面我们来看一下简单的思路:
简单工厂模式是为了实现代码的解耦,将实现代码初始化的过程提取到一个类中。
简单的类图:
================第一次画类图,如果哪里有问题,还望拍砖===================
实现过程:
首先,我们定义一个接口IWork,用来规范子类拥有的方法:
public interface IWork {
void doWork();
}
其次,我们用StudentWork和TeacherWork实现这个接口。
public class StudentWork implements IWork {
@Override
public void doWork() {
// TODO Auto-generated method stub
System.out.println("StudentWork====doWork");
}
}
public class TeacherWork implements IWork {
@Override
public void doWork() {
// TODO Auto-generated method stub
System.out.println("TeacherWork====doWork");
}
}
接着,我们来定义自己的简单工程接口,用来生成IWork:
public interface IWorkFactory {
IWork getWork(String workName);
}
让我们来实现这个工厂:
public class WorkFactory implements IWorkFactory {
@Override
public IWork getWork( String workName ) {
if ("student".equals(workName)) {
return new StudentWork();
} else if ("teacher".equals(workName)) {
return new TeacherWork();
} else {
return null;
}
}
}
这样,一个简单工厂模式就算是完成了。下面我们来进行测试:
public class Text {
public static void main(String[] args) {
IWorkFactory workFactory = new WorkFactory();
IWork studentWork = workFactory.getWork("student");
studentWork.doWork();
IWork teacherWork = workFactory.getWork("teacher");
teacherWork.doWork();
}
}
运行结果如下:
很多情况下,会将生成方法设为静态,虽然这样做很方便在其他类中调用,但是,如果我们需要继承这个工厂类,那么将不能重写这个工厂方法。
静态工厂类:
此处我们不能继续使用接口,因为static 不能在接口中定义方法。所以我们新建一个StaticWorkFactory类。
public class StaticWorkFactory {
public static IWork getWork( String workName ) {
if ("student".equals(workName)) {
return new StudentWork();
} else if ("teacher".equals(workName)) {
return new TeacherWork();
} else {
return null;
}
}
}
其他类和上面提到的相同,就不再多说。
下面我们看测试类:
public class StaticText {
public static void main(String[] args) {
IWorkFactory workFactory = new WorkFactory();
IWork studentWork = workFactory.getWork("student");
studentWork.doWork();
IWork teacherWork = workFactory.getWork("teacher");
teacherWork.doWork();
}
}
运行结果如下: