研磨设计模式----工厂模式

简单工厂模式

为什么要使用简单工厂模式:

如果像书上所写用:Api api=new Impl();客户端就知道了接口和实现的类。想想接口的思想是隔离封装。客户端不能知道Impl这个类的。但是这又会造成只知接口而不知其实现的问题。所以诞生了简单工厂。

简单工厂的定义:提供一个创建实例的功能,而无须其内部实现

上代码

 

 

可能有的朋友会觉得只是把一个new impl()移到了工厂内部。但是我只能这个问题理解的重点是理解简单工厂的位置

这幅图很好的展示了简单工厂的原理。在客户端只知道接口和工厂类。但是并不知道被包围在虚线框内的实现类。这样就实现了客户不知道实现但是能创建接口实例了

 

简单工厂的认识:

1.用来造东西的,造接口,抽象类,实例都可以啦

2.不用创建简单工厂的实例,内部的方法都是静态的。还有将构造方法设为私有,防止客户乱造工厂

3.简单工厂什么都能造,但是最好不要把所有的创建工作都交给一个工厂做。有点像大杂烩,一般以一个模块为主。

简单工厂命名建议:

1.类名建议:模块+Factory。如UserFactory

2.方法名:“get+接口名称”或“create+接口名称”如getUser()或createUser();

但是用以上方法。必须传入一个参数。用户必须知道参数的意思,所以还是一定暴露了实现

 

如果想要添加一种新的实现而不修改代码。可用可配置工厂模式。用xml文件来创建类

可配置的工厂:

 package factorymodel;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

class MessageAImpl implements MessageA {

@Override
public void messagePrint() {
System.out.println("A");
}
}

class MessageBImpl implements MessageB {

@Override
public void messagePrintB() {
System.out.println("B");
}
}

public class FactorySettle {
public static MessageA createMessageA() {
Properties properties = new Properties();
InputStream in = null;
//取得java.properties的资源
try {
in = FactorySettle.class.getResourceAsStream("/java.properties");

properties.load(in);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {

in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
MessageA messageA = null;
try {
messageA = (MessageA) Class.forName(properties.getProperty("javaclass")).newInstance();
System.out.println("messagea");
return messageA;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
System.out.println("create messageA fail");
return null;
}

public static void main(String[] args) {
MessageA messageA=FactorySettle.createMessageA();
messageA.messagePrint();
}
}

 

 

 

这样就不用修改源代码,直接改配置文件就好了。

posted @ 2017-03-30 20:15  戴林甫  阅读(261)  评论(0编辑  收藏  举报