JavaSE的设计模式,JavaSE设计模式
JavaSE的设计模式,JavaSE设计模式
GOF总结了JavaSE开发中常见的23种设计模式,可以分为3大类:创建型模式、结构型模式、行为型模式
JavaEE模式目前缺乏统一的说法。
JavaEE设计模式特别关注表示层,如MVC模式(MVC Pattern)另外有 数据访问对象模式DAO(Data Access Object Pattern)
前端控制器模式(Front Controller Pattern) ... ...
DOP的核心是面向抽象编程,面向抽象编程的核心是面向接口
接口的实现可能有多个,如何实现在多个接口具体实现之间进行切换,方法:使用工厂模式
IA a = new AImpl()然后通过a来调用接口的方法,对于C来说是主动实例化对象,直接获取依赖.
这种实现方法的缺点:
a、更换实现需要重新编译源代码
b、很难更换实现,很难测试
c、耦合实例生产者和实例消费者
工厂模式 [用途 应用场景(优缺点) 编码实现]
设计模式属于创建型模式,它提供了一种创建对象的最佳方式
主要解决:主要解决接口实现的选择问题。
抽象角色:
public interface IShape {
void draw();
}
多种实现:产品角色
public class Circle implements IShape {
public void draw() {
System.out.println("圆形");
}
}
工厂角色:
public class ShapeFactory {
public IShape getShape(String type){
if("circle".equals(type))
return new Circle();
return null;
}
}
例如DAO这种,使用的是工厂模式的退化版本:静态工厂方法模式
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,
在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
工厂模式中产品可扩展,但是产品只能一种系列
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
抽象工厂模式,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
主要解决:提供一个创建一系列相关或相互依赖对象的接口,解决接口实现选择的问题。
public abstract class AbstractFactory {
public abstract Color getColor(String color); 生产产品方法1,用于生产Color接口的实现
public abstract Shape getShape(String shape) ; 生产产品方法2,用于生产Shape接口的实现
}
优点:
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
产品的系列不可扩展,引入资源文件,使用反射创建字串所指代的对象
public class MyFactory {
private static final Properties ps = new Properties();
private static final Logger logger = LoggerFactory.getLogger(MyFactory.class);
public static Object getImpl(String type) {
loadProperties();
if (ps.containsKey(type)) {
String className = ps.getProperty(type);
try {
return Class.forName(className).newInstance(); 使用反射创建对应的对象,这里要求类中必须有对应的无参构造器可以访问
} catch (Exception e) {
logger.error(e.getMessage());
}
}
return null;
}
private static void loadProperties() {
if (ps.isEmpty())
try {
InputStream is = MyFactory.class.getResourceAsStream("produce.properties");
ps.load(is);
} catch (Exception e) {
logger.error(e.getMessage());
}
}
}
调用的方法:
IProduce p=(IProduce)MyFactory.getImpl("produce");
properties文件在IDE中缺乏语法检查,所以考虑采用xml作为配置
相关文章
- 暂无相关文章
用户点评