Java设计模式(一)设计模式的原则、工厂方法和抽象工厂

 

有人对我说,不会设计模式别说你会OO。这段时间再次把Java设计模式拿出来学习了下,总结下学习心得,大家一起分享。

 

 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

 

GoF(“四人帮”,指Gamma, Helm, Johnson & Vlissides, Addison-Wesley四人)的《设计模式》(1995年出版)是第一次将设计模式提升到理论高度,并将之规范化,本书提出了23种基本设计模式,自此,在可复用面向对象软件的发展过程中,新的大量的设计模式不断出现。

 

设计模式的原则

"开-闭"原则(Open Closed Principal)

    此原则是由"Bertrand Meyer"提出的。说的是模块应对扩展开放,而对修改关闭。模块应尽量在不修改原代码的情况下进行扩展。

里氏代换原则

    里氏代换原则是由"Barbara Liskov"提出的。如果调用的是父类的话,那么换成子类也完全可以运行。

合成复用原则

    要少用继承,多用合成关系来实现。使变化限制在最小范围内

依赖倒转原则

    抽象不应该依赖于细节,细节应当依赖于抽象。要针对接口编程,而不是针对实现编程。
接口隔离原则

    每一个接  口应该是一种角色,不多不少,不干不该干的事,该干的事都要干

抽象类

    抽象类不会有实例,一般作为父类为子类继承,一般包含这个系的共同属性和方法。

迪米特法则

    最少知识原则。不要和陌生人说话。

 

创建模式一 :抽象工厂和工厂方法

 

工厂方法

在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。如何应对这种变化?提供一种封装机制来隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变?这就是要说的Factory Method 模式了。

定义一个用户创建对象的接口,让子类决定实例化哪一个类。 Factory Method 使一个类的实例化延迟到其子类。


工厂方法经常用在以下两种情况中:
第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。

 

主要参与者:

抽象工厂

public interface Factory {

        Product Create();

}

具体工厂

public class ConcreteFactory implements Factory{

            public Product Create(){

           //create code;

         }

}

抽象产品

public interface Product {

           //some function

}

具体产品

public class ConcreteProduct implements  Product {

           //some function implements

}


实现:

Factory factory = new ConcreteFactor();

Product product = factor.create();

 

使用要点

不知道要创建的对象的具体类或知道 创建的对象的具体类但这个类的变化很快的 时候,使用工厂方法

 

实现要点

1、可以使用抽象类或接口进行 抽象

2、允许提供一个缺省的工厂方法(实现),这时候抽象工厂就是个具体类了

3、 产品的生成需要参数时,工厂方法是可以带参数。( 产品和工厂始终保持平行

4、工厂的作用并不仅仅只是创建一个对象,它还可以做对象的初始化,参数的设置等。


 


抽象工厂

在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在更多系列对象的创建工作、
如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?

提供一个接口,让该接口负责创建一系列“相关或相互依赖的对象”,无需制定它们具体的类。


主要参与者:

抽象工厂

public interface Factory {

        ProductA CreateA ();

        ProductA CreateB ();

}

具体工厂

public class ConcreteFactory implements Factory{

            public Product Create A (){

           //create code;

         }

         public Product Create B (){

           //create code;

         }

}

抽象产品

public interface Product A {

           //some function

}

public interface Product B {

           //some function

}

具体产品系列(系列1)

public class ConcreteProduct A 1 implements Product A {

           //some function implements

}

public class ConcreteProduct B 1 implements ProductB {

           //some function implements

}

...

 

实现:

Factory factory = new ConcreteFactor();

Product A product = factor. CreateA ();

Product B product = factor. CreateB ();

 

使用要点

抽象工厂模式主要在于应对"新系列"的需求变动,其缺点是难以应对"新对象"的需求变动。

如果没有应对"多系列对象构建"的需求变化,则没有必要使用抽象工厂模式,这时候使用简单工厂完全可以。

"系列对象"指的是这些对象之间有相互依赖、或作用的关系,例如游戏开发场景中的"道路"与"房屋"的依赖,"道路"与"地道"的依赖。

抽象工厂模式经常与工厂方法模式共同组合来应对"对象创建"的需求变动

 

实现要点

1、可以使用抽象类或接口进行 抽象

2、允许提供一个缺省的工厂方法(实现),这时候抽象工厂就是个具体类了

3、 产品的生成需要参数时,工厂方法是可以带参数。( 产品和工厂始终保持平行

4、工厂的作用并不仅仅只是创建一个对象,它还可以做对象的初始化,参数的设置等。

 

简单工厂

只有 系列对象构建时,则没有必要用到抽象工厂接口,用具体工厂类就可以实现,此时 为 简单工厂

 

区别 工厂方法抽象工厂

工厂方法是针对于单个对象的创建,而抽象工厂是针对于系列对象(多个相关或相互依赖的对象)的创建

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

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值