设计模式——单例
知识点:没有控制个数
线程安全优化 :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;
}
}
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
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 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();
}
}
}
@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
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;
}
}
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
.......
single.single@24c21495
single.single@24c21495
single.single@24c21495
.......
设计模式——工厂(本质:选择实现)
知识点:1、接口 2、实现类 3、工厂
public interface Api {
public String t1();
}
public String t1();
}
public class DeptImpl1 implements Api {
@Override
public String t1() {
return "1111111111";
}
}
@Override
public String t1() {
return "2222222222";
}
}
public class DeptFactory {
public static Api getDeptApi() {
return new DeptImpl1();
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);
}
}
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 + "]";
}
}