java设计模式---浅谈2种工厂模式和单例模式

来源:互联网 发布:印度主流聊天软件 编辑:程序博客网 时间:2024/04/29 08:21

1、 工厂模式  。比如有一个统一接口  A   ,这个A接口是一个标准  。如果有类  B  和 C   那么 BC必须实现A接口  。

我们在以往的 方法生成这种对象的时候   A  b=new  B() ;  A c=new C() ;这样的方式来的 .但是如果不同的类需要不同的初始化的时候我们如果全部放在构造方法完成那么

就严重破坏了 面向对象的概念 。   我们想要的就是一个工厂 Factory ,也就是一个代理  我们通过它的唯一接口来 产生不同类型的产品 。下面是一段代码 :

1、一般的工厂

interface Product   //这里接口只是为了保证 返回的对象可以 统一用 Product接受 
{
 void show() ;
}
class  ProductA  implements Product
{

 @Override
 public void show() {
  System.out.println("Product A!");
  
 }
 

class  ProductB   implements Product     
{

 @Override
 public void show() {
  System.out.println("Product B");
  
 }
 
}
public class Factory     //作为工厂来使用

 public static Product getProduct(int product_index)
 {
  if(product_index==0)
   return new ProductA();
  if(1==product_index)
   return new ProductB() ;
  return null; 
 }
}

 2、反射类型的工厂   ,看下面工厂方式 你有什么感想呢?java web开发中经常用到

package me.test;
interface Product   //这里接口只是为了保证 返回的对象可以 统一用 Product接受 
{
 void show() ;
}
class  ProductA  implements Product
{

 @Override
 public void show() {
  System.out.println("Product A!");
  
 }
 

class  ProductB   implements Product     
{

 @Override
 public void show() {
  System.out.println("Product B!");
  
 }
 
}
public class Factory     //作为工厂来使用

 public static Product getProduct(String className) throws InstantiationException, IllegalAccessException, ClassNotFoundException
 {
  return (Product)Class.forName(className).newInstance() ;
  
 }
 public static void main(String []args) throws InstantiationException, IllegalAccessException, ClassNotFoundException
 {
   
  Product a=Factory.getProduct("me.test.ProductA") ;
  a.show() ;
  Product b=Factory.getProduct("me.test.ProductB") ;
  b.show() ;
  }
}

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                                        单例模式 Singleton    就是保证一个类只有一个实例 。。2中方法

1、
class  One
{
 private One(){}
    private static One instance =null ;
 public synchronized static One getInstance()
 { 
  if(instance==null)
   instance=new One() ;
  return instance;
 }
}
public class Singleton {
 public static void main(String[] args)
 {
  Object obj1,obj2 ;
  obj1=One.getInstance() ;
  obj2=One.getInstance() ;
  System.out.println("(obj1==obk2)="+(obj1==obj2));  //结果为True证明实例唯一
 }

}

2、方法2    相比第一种方法 这种方法不需要一次次判断内置对象是否为空
class  One
{
 private One(){}
    private static One instance =new One() ;
 public  static One getInstance()
 { 
  return instance ;
 }
}
public class Singleton {
 public static void main(String[] args)
 {
  Object obj1,obj2 ;
  obj1=One.getInstance() ;
  obj2=One.getInstance() ;
  System.out.println("(obj1==obk2)="+(obj1==obj2));  //结果为True证明实例唯一
 }

}