[转帖]单例模式和工厂模式 简单实例_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3424 | 回复: 0   主题: [转帖]单例模式和工厂模式 简单实例        下一篇 
只是很无聊
注册用户
等级:中尉
经验:440
发帖:33
精华:0
注册:2013-6-18
状态:离线
发送短消息息给只是很无聊 加好友    发送短消息息给只是很无聊 发消息
发表于: IP:您无权察看 2013-6-18 17:35:39 | [全部帖] [楼主帖] 楼主

面是一个静态的单例模式,类创建时就生成这样一个永久实例。

Java代码  
北京联动北方科技有限公司

  1. //饿汉式单例类.在类初始化时,已经自行实例化 
  2.  public class Singleton1 { 
  3.        //私有的默认构造子 
  4.  private Singleton1() {} 
  5.        //已经自行实例化 
  6.        private static final Singleton1 single = new Singleton1(); 
  7.        //静态工厂方法 
  8.        public static Singleton1 getInstance() { 
  9.              return single; 
  10.        } 
  11.  } 



下面是一个动态的单例模式,需要时才生成一个实例。

Java代码  
北京联动北方科技有限公司

  1. //懒汉式单例类.在第一次调用的时候实例化 
  2.  public class Singleton2 { 
  3.        //私有的默认构造子 
  4.  private Singleton2() {} 
  5.        //注意,这里没有final 
  6.        private static Singleton2 single=null; 
  7.        //静态工厂方法 
  8.        public synchronized static Singleton2 getInstance() { 
  9.              if (single == null) { 
  10.                    single = new Singleton2(); 
  11.              } 
  12.              return single; 
  13.        } 
  14.  } 



再来看看工厂模式,工厂方法模式有四个要素:

工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。在实际编程中,有时候也会使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。
工厂实现。在编程中,工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的工厂实现。
产品接口。产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。同样,产品接口也可以用抽象类来代替,但要注意最好不要违反里氏替换原则。
产品实现。实现产品接口的具体类,决定了产品在客户端中的具体行为。
适用场景:

        不管是简单工厂模式,工厂方法模式还是抽象工厂模式,他们具有类似的特性,所以他们的适用场景也是类似的。

        首先,作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特 别是只需要通过new就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

       其次,工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品需要增加依赖关系时,可以考虑使用工厂模式。将会大大降低对象之间的耦合度。

       再次,由于工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完成,扩展性比较好。也就是说,当需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装。

典型应用

       要说明工厂模式的优点,可能没有比组装汽车更合适的例子了。场景是这样的:汽车由发动机、轮、底盘组成,现在需要组装一辆车交给调用者。假如不使用工厂模式,代码如下:

Java代码  
北京联动北方科技有限公司

  1. class Engine { 
  2.        public void getStyle(){ 
  3.              System.out.println("这是汽车的发动机"); 
  4.        } 
  5. class Underpan { 
  6.        public void getStyle(){ 
  7.              System.out.println("这是汽车的底盘"); 
  8.        } 
  9. class Wheel { 
  10.        public void getStyle(){ 
  11.              System.out.println("这是汽车的轮胎"); 
  12.        } 
  13. public class Client { 
  14.        public static void main(String[] args) { 
  15.              Engine engine = new Engine(); 
  16.              Underpan underpan = new Underpan(); 
  17.              Wheel wheel = new Wheel(); 
  18.              ICar car = new Car(underpan, wheel, engine); 
  19.              car.show(); 
  20.        } 



可以看到,调用者为了组装汽车还需要另外实例化发动机、底盘和轮胎,而这些汽车的组件是与调用者无关的,严重违反了迪米特法则,耦合度太高。并且 非常不利于扩展。另外,本例中发动机、底盘和轮胎还是比较具体的,在实际应用中,可能这些产品的组件也都是抽象的,调用者根本不知道怎样组装产品。假如使 用工厂方法的话,整个架构就显得清晰了许多。

Java代码  
北京联动北方科技有限公司

  1. interface IFactory { 
  2.        public ICar createCar(); 
  3. class Factory implements IFactory { 
  4.        public ICar createCar() { 
  5.              Engine engine = new Engine(); 
  6.              Underpan underpan = new Underpan(); 
  7.              Wheel wheel = new Wheel(); 
  8.              ICar car = new Car(underpan, wheel, engine); 
  9.              return car; 
  10.        } 
  11. public class Client { 
  12.        public static void main(String[] args) { 
  13.              IFactory factory = new Factory(); 
  14.              ICar car = factory.createCar(); 
  15.              car.show(); 
  16.        } 



使用工厂方法后,调用端的耦合度大大降低了。并且对于工厂来说,是可以扩展的,以后如果想组装其他的汽车,只需要再增加一个工厂类的实现就可以。无论是灵活性还是稳定性都得到了极大的提高。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论