您的位置:首页 > 编程语言 > Java开发

java设计模式----工厂模式

2015-12-02 11:22 471 查看
软件设计的要点是高内聚低耦合,而工厂模式则满足了这个要求,工厂模式分为三种:简单工厂模式(静态工厂类),工厂方法模式,抽象工厂模式。先上代码

简单工厂模式

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实现接口方法


很简单的一个道理,不用工厂模式意味着我们吃饭要自己做,简单工厂模式是工厂给你做,你要做菜则调用工厂做菜方法,要做米饭调用工厂做米饭方法,工厂方法模式则是分多个工厂,做菜的工厂和做饭的工厂,调用统一的做接口。做饭和做菜两个工厂实现做的方法,要做饭则实例化做饭工厂,要做菜则实例化做菜工厂。所工厂方法模式耦合度更低。

抽象工厂模式

抽象工厂模式和工厂方法模式类似,区别在于

工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品类的实例。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: