设计模式之单例、多例、工厂、值对象

来源:互联网 发布:js判断输入框是否获焦 编辑:程序博客网 时间:2024/05/21 10:32

     设计模式——单例

知识点:没有控制个数
  线程安全优化 :synchronized
  常量:final

//懒汉式
public class single {
     private static single s = null;
     private single(){
 
   }//写了这个,默认的构造函数则关闭
    public synchronized static single getInstance(){ 
if(s==null)
s = new single();
return s;
}
}
//饿汉式---耗内存。来一个new一个
public class single2 {
   private final static single2 s = new single2();
   private single2(){
  
   }
   public static single2 getInstance(){
  return s;
   }
}

//测试
public class singleTest {
public static void main(String[] args) {
     single s = single.getInstance();
     single s1= single.getInstance();
     System.out.println(s);
     System.out.println(s1);
  
     single2 ss = single2.getInstance();
     single2 ss1 = single2.getInstance();
     System.out.println(ss);
     System.out.println(ss1);
}
}
//结果
shejimoshi.single@55f33675
shejimoshi.single@55f33675
shejimoshi.single2@65690726
shejimoshi.single2@65690726



知识点:使用多线程,可以控制个数 

public class testThread {
public static void main(String[] args) {
       Thread ts[]=new Thread[50];
       for(int i=0;i<ts.length;i++){
     ts[i] = new usesingleThread();
      }
      for(int i=0;i<ts.length;i++){
     ts[i].start();
      }
   }
}

public class usesingle Thread  extends Thread {
@Override
public void run() {
single s = single.getInstance();
System.out.println(s);
}
}

     设计模式——单例变形(多例)


import java.util.HashMap;
import java.util.Map;


//定义用来缓存数据的容器
public class A {
     private static Map<String,A> map = newHashMap<String, A>();
     public static A getInstance(String key){

//到容器(缓存)中去查找key所对应的对象,如果没有,那么就new一个,放到里面,否则直接返回

    A   a = map.get(key);
    if(a==null){
    a = new A();
    map.put(key, a);
    }
      return a;
     }
     
}

//结果
single.single@41d5550d
single.single@41d5550d
single.single@41d5550d
single.single@41d5550d
single.single@41d5550d
......



import java.util.HashMap;
import java.util.Map;
import single.single;


public class AA {
   private static Map<Integer,AA> map = new HashMap<Integer, AA>();
   private static int count=3;//控制缓存中实例的总数(该整数可以采用用户设置或读取配置文件的方式更改)
   private static int num=1;//当前实例的序号---用num来当作内部维护的key
   public static AA getIntance(String key){
   AA a =map.get(num);
   if(a==null){
    a  = new AA();
    map.put(num, a);
   }
   num++;
   if(num>count){
    num=1;
   }
   return a;
   }
}

//结果
single.single@24c21495
single.single@24c21495
single.single@24c21495
single.single@24c21495
.......

  设计模式——工厂(本质:选择实现)

知识点:1、接口  2、实现类 3、工厂
public interface Api { 
  public String t1();
}

public class DeptImpl1 implements Api {

@Override
public String t1() {
return "1111111111";
}
}

public class DeptImpl2 implements Api{

@Override
public String t1() {
return "2222222222";
}
}

public class DeptFactory {
public static Api getDeptApi() {
return new DeptImpl1();
              //  return new DeptImpl2();
}
}

public class client {
public static void main(String[] args) {
       Api api = DeptFactory.getDeptApi();
       String str = api.t1();
       System.out.println(str);
}
}

  设计模式——值对象(本质:封装数据)

//第1步:写一个类,实现可序列化
public class AddressVO implements Serializable{

//第2步:私有化所有属性,保持一个默认构造方法(public无参)
   private String userId,name,address;
   private boolean isMale;
   public AddressVO(){
   }
 //这个全参构造方法,根据需要添加

public AddressVO(String userId, String name, String address) {
this.userId = userId;
this.name = name;
this.address = address;
}

//第3步:为每个属性提供get()、set()方法(如果是boolean型变量,最好把get改成is)
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public boolean isMale() {
return isMale;
}
public void setMale(boolean isMale) {
this.isMale = isMale;
}

//第4步:推荐覆盖实现equals()、hashCode()和toString()方法

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((userId == null) ? 0 : userId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
AddressVO other = (AddressVO) obj;
if (userId == null) {
if (other.userId != null)
return false;
} else if (!userId.equals(other.userId))
return false;
return true;
}
@Override
public String toString() {
return "AddressVO [userId=" + userId + ", name=" + name + ", address="
+ address + ", isMale=" + isMale + "]";
}
}



0 0
原创粉丝点击