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作为配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值