软件设计的要点是高内聚低耦合,而工厂模式则满足了这个要求,工厂模式分为三种:简单工厂模式(静态工厂类),工厂方法模式,抽象工厂模式。先上代码
简单工厂模式
1)工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
2)抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
3)具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
新建一个接口:
package factory;
public interface Interface {
public void operate();
}
再建两个实现类:
package factory;
public class Impl implements Interface{
@Override
public void operate() {
System.out.println("实现接口方法");
}
}
package factory;
public class Impl1 implements Interface{
@Override
public void operate() {
System.out.println("Impl1实现接口方法");
}
}
工厂类:
package factory;
/**
* 工厂方法
* @author mercy
*
*/
public class Factory {
private Interface in;
private Interface in1;
public Interface getInterface() {
if (in == null) {// 如果不存在则创建实例
in = new Impl();
}
return in;
}
public Interface getInterface1() {
if (in1 == null) {// 如果不存在则创建实例
in1= new Impl1();
}
return in1;
}
}
测试下:
package factory;
/**工厂模式
* @author mercy
*
*/
public class Test {
public static void main(String[] args) {
Factory f=new Factory();//创建工厂实例
Interface in=f.getInterface();//通过工厂方法获取Impl实例
in.operate();
Interface in1=f.getInterface();//通过工厂方法获取Impl实例
in1.operate();
}
}
结果:
实现接口方法
impl1实现接口方法
这样看工厂模式的优点是实现接口编程.而如果再新建几个接口的实现类,则如果按照正常方法,需要多新建几个对象的实例
package factory;
public class badTest{
public static void main(String[] args) {
Interface i=new Impl();
i.operate();
Interface i1=new Impl1();
i1.operate();
}
}
这样的话实现与接口直接通信,根据DIP原则,要针对接口编程,而不是针对实现编程。这样不用把具体的类暴露给客户端,客户端直接调工厂实例的方法即可。
看看工厂方法模式,只需要写一个相同的工厂类接口,再添加具体的工厂实现类
1)抽象工厂类:具体工厂类的抽象类。
1)具体工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
3)抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
4)具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
抽象工厂类
package factory;
public interface Fac {
public Interface getInterface();
}
具体工厂类1
package factory;
public class Factory1 implements Fac{
private Interface in;
public Interface getInterface() {
if (in == null) {//如果不存在则创建实例
in = new Impl();
}
return in;
}
}
具体工厂类2
package factory;
public class Factory2 implements Fac{
private Interface in;
@Override
public Interface getInterface() {
if (in == null) {//如果不存在则创建实例
in = new Impl1();
}
return in;
}
}
测试下:
package factory;
/**工厂模式
* @author mercy
*
*/
public class Test {
public static void main(String[] args) {
/*简单工厂模式*/
Factory f=new Factory();//创建工厂实例
Interface in=f.getInterface();//通过工厂方法获取Impl实例
in.operate();
Interface in1=f.getInterface1();
in1.operate();
/*工厂方法模式,比简单工厂模式更降低耦合度,只需要调不同的工厂方法,保持工厂接口方法不变*/
Fac ff=new Factory1();
Interface i=ff.getInterface();//获取impl的实例
i.operate();
Fac ff1=new Factory2();
Interface i1=ff1.getInterface();//获取impl的实例
i1.operate();
}
}
结果:
Impl1实现接口方法
实现接口方法
Impl1实现接口方法
很简单的一个道理,不用工厂模式意味着我们吃饭要自己做,简单工厂模式是工厂给你做,你要做菜则调用工厂做菜方法,要做米饭调用工厂做米饭方法,工厂方法模式则是分多个工厂,做菜的工厂和做饭的工厂,调用统一的做接口。做饭和做菜两个工厂实现做的方法,要做饭则实例化做饭工厂,要做菜则实例化做菜工厂。所工厂方法模式耦合度更低。
抽象工厂模式
抽象工厂模式和工厂方法模式类似,区别在于
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品类的实例。