java中需要面向接口编程,传统的做法是:
/**
定义一个接口
*/
public interface Api {
public void test(String s);
}
/**
定义一个具体的实现类
*/
public class Impl implements Api {
public void test(String s) {
System.out.print("now in impl");
}
}
/**
客户端使用接口的实现类
*/
public class Client {
public static void main(String[] args) {
//但是客户端不但知道了接口Api,还知道具体的实现类Impl,
//没有体现接口的 "封装隔离特性"
Api api=new Impl();
api.test("this is a test");
}
}
其实只是用到了接口的多态部分的功能,而最重要的“封装隔离性”并没有体现出来。
简单工厂能帮助我们真正开始面向接口编程。
简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
简单工厂的本质是:选择实现。
简单工厂的重点在选择,而实现是已经存在的,要有具体的实现类来实现,而不是在简单工厂里面实现。
简单工厂的目的在于为客户端来选择相应的实现,从而使得客户端与实现之间解耦。
同一个例子:
/**
定义一个接口
*/
public interface Api {
public void test(String s);
}
/**
定义一个具体的实现类 Impl
*/
public class Impl implements Api {
public void test(String s) {
System.out.print("now in impl");
}
}
/**
再定义一个具体的实现类 Impl2
*/
public class Impl2 implements Api {
public void test(String s) {
System.out.print("now in impl2");
}
}
/**
定义一个简单工厂
*/
public class Factory {
/**
* 根据参数选择不同的实现对象(参数可以来源于客户端,也可以来源于配置文件,利用反射机制或Ioc/依赖注入)
*
* 返回创建好的Api对象
* */
public static Api createApi(int condition) {
Api api=null;
if(condition==1){
api=new Impl();
}else if(condition==2){
api=new Impl2();
}
return api;
}
/**
一个简单工厂可以包含很多不同的方法来创建不同的接口、抽象类或者是类实例。一个简单工厂理论上可以构造任何东西,也成为万能工厂
*/
public static People createStudent(int condition) {
People people=null;
if(condition==1){
people=new Stu1();
}else if(condition==2){
people=new Stu2();
}
return people;
}
/**
虽然从理论上讲,简单工厂什么都能创建,但是一般不要太大,建议控制在一个独立的组件级别或者模块级别。
*/
}
/**
客户端使用接口的实现类
*/
public class Client {
public static void main(String[] args) {
/**
1、让简单工厂来负责创建接口对象,而不是由客户端自己去创建接口对象
2、通常没有必要创建简单工厂类的类实例,可以把简单工厂实现成一个工具类,直接使用静态方法就可以,所以也被成为静态工厂
*/
Api api=Factory.createApi(1);
api.test("this is a test");
}
}
简单工厂与相关模式的区别:
1、简单工厂 和 抽象工厂模式
1.1、简单工厂是用来选择实现的,可以选择任意接口的实现。一个简单工厂可以有多个用于选择并创建对象的方法,多个方法创建的对象可以有关系也可以没有关系。
1.2、抽象工厂模式是用来选择 产品簇 的,它也有多个用于选择并创建对象的方法,但是这些方法所创建的对象之间通常是有关系的,这些被创建的对象通常是构成一个产品簇所需要的部件对象。
简单工厂和抽象工厂是类似的,如果抽象工厂退化成只有一个实现,且不分层次,那么就相当于是简单工厂了。
2、简单工厂 和 工厂方法模式
2.1、工厂方法的本质也是用来选择实现的,区别在于把选择具体实现的功能延迟到子类去实现。