单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
模型图
代码
public class Singleton {
public static Singleton singleton=null;
private Singleton(){
}
public static Singleton getInstance(){
if(null==singleton){
synchronized (Singleton.class) {
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
public void dosome(){
}
}
public class TestCase {
public static void main(String[] args) {
Singleton s1=Singleton.getInstance();
Singleton s2=Singleton.getInstance();
if(s1==s2){
System.out.println("s1:="+s1+"s2:="+s2);
}
}
}
案例 代码中有一个白名单的类,由于在很多地方都会用到这个类,又不方便在很多地方都创建这样的类实例
所以就把这个类创建成一个单例对象
代码
public class WhiteValidUtils {
//省份
private static List<String> provinces=new ArrayList<String>();
//城市
private static List<String> citys=new ArrayList<String>();
//ip地址
private static List<String> ips=new ArrayList<String>();
public static final Logger logger=Logger.getLogger(WhiteValidUtils.class);
public static final String place[][] = {
{"北京市","市辖区","市辖县"},
{"天津市","市辖区","市辖县"},
{"安徽省","安庆市","蚌埠市","亳州市","巢湖市","池州市","滁州市","阜阳市","合肥市","淮北市","淮南市","黄山市","六安市","马鞍山市","宿州市","铜陵市","芜湖市","宣城市"},
{"澳门特别行政区","澳门"},
{"香港特别行政区","香港"},
{"福建省","福州市","龙岩市","南平市","宁德市","莆田市","泉州市","厦门市","漳州市"},
{"甘肃省","白银市","定西市","甘南藏族自治州","嘉峪关市","金昌市","酒泉市","兰州市","临夏回族自治州","陇南市","平凉市","庆阳市","天水市","武威市","张掖市"},
{"广东省","潮州市","东莞市","佛山市","广州市","河源市","惠州市","江门市","揭阳市","茂名市","梅州市","清远市","汕头市","汕尾市","韶关市","深圳市","阳江市","云浮市","湛江市","肇庆市","中山市","珠海市"},
{"广西壮族自治区","百色市","北海市","崇左市","防城港市","贵港市","桂林市","河池市","贺州市","来宾市","柳州市","南宁市","钦州市","梧州市","玉林市"},
{"贵州省","安顺市","毕节地区","贵阳市","六盘水市","黔东南苗族侗族自治州","黔南布依族苗族自治州","黔西南布依族苗族自治州","铜仁地区","遵义市"},
{"海南省","海口市","三亚市","省直辖县级行政区划"},
{"河北省","保定市","沧州市","承德市","邯郸市","衡水市","廊坊市","秦皇岛市","石家庄市","唐山市","邢台市","张家口市"},
{"河南省","安阳市","鹤壁市","焦作市","开封市","洛阳市","漯河市","南阳市","平顶山市","濮阳市","三门峡市","商丘市","新乡市","信阳市","许昌市","郑州市","周口市","驻马店市"},
{"黑龙江省","大庆市","大兴安岭地区","哈尔滨市","鹤岗市","黑河市","鸡西市","佳木斯市","牡丹江市","七台河市","齐齐哈尔市","双鸭山市","绥化市","伊春市"},
{"湖北省","鄂州市","恩施土家族苗族自治州","黄冈市","黄石市","荆门市","荆州市","十堰市","随州市","武汉市","咸宁市","襄樊市","孝感市","宜昌市"},
{"湖南省","长沙市","常德市","郴州市","衡阳市","怀化市","娄底市","邵阳市","湘潭市","湘西土家族苗族自治州","益阳市","永州市","岳阳市","张家界市","株洲市"},
{"吉林省","白城市","白山市","长春市","吉林市","辽源市","四平市","松原市","通化市","延边朝鲜族自治州"},
{"江苏省","常州市","淮安市","连云港市","南京市","南通市","苏州市","宿迁市","泰州市","无锡市","徐州市","盐城市","扬州市","镇江市"},
{"江西省","抚州市","赣州市","吉安市","景德镇市","九江市","南昌市","萍乡市","上饶市","新余市","宜春市","鹰潭市"},
{"辽宁省","鞍山市","本溪市","朝阳市","大连市","丹东市","抚顺市","阜新市","葫芦岛市","锦州市","辽阳市","盘锦市","沈阳市","铁岭市","营口市"},
{"内蒙古自治区","阿拉善盟","巴彦淖尔市","包头市","赤峰市","鄂尔多斯市","呼和浩特市","呼伦贝尔市","通辽市","乌海市","乌兰察布市","锡林郭勒盟","兴安盟"},
{"宁夏回族自治区","固原市","石嘴山市","吴忠市","银川市","中卫市"},
{"青海省","果洛藏族自治州","海北藏族自治州","海东地区","海南藏族自治州","海西蒙古族藏族自治州","黄南藏族自治州","西宁市","玉树藏族自治州"},
{"山东省","滨州市","德州市","东营市","菏泽市","济南市","济宁市","莱芜市","聊城市","临沂市","青岛市","日照市","泰安市","威海市","潍坊市","烟台市","枣庄市","淄博市"},
{"山西省","长治市","大同市","晋城市","晋中市","临汾市","吕梁市","朔州市","太原市","忻州市","阳泉市","运城市"},
{"陕西省","安康市","宝鸡市","汉中市","商洛市","铜川市","渭南市","西安市","咸阳市","延安市","榆林市"},
{"四川省","阿坝藏族羌族自治州","巴中市","成都市","达州市","德阳市","甘孜藏族自治州","广安市","广元市","乐山市","凉山彝族自治州","泸州市","眉山市","绵阳市","内江市","南充市","攀枝花市","遂宁市","雅安市","宜宾市","资阳市","自贡市"},
{"西藏自治区","阿里地区","昌都地区","拉萨市","林芝地区","那曲地区","日喀则地区","山南地区"},
{"新疆维吾尔自治区","阿克苏地区","阿勒泰地区","巴音郭楞蒙古自治州","博尔塔拉蒙古自治州","昌吉回族自治州","哈密地区","和田地区","喀什地区","克拉玛依市","克孜勒苏柯尔克孜自治州","塔城地区","吐鲁番地区","乌鲁木齐市","伊犁哈萨克自治州","自治区直辖县级行政区划"},
{"云南省","保山市","楚雄彝族自治州","大理白族自治州","德宏傣族景颇族自治州","迪庆藏族自治州","红河哈尼族彝族自治州","昆明市","丽江市","临沧市","怒江僳僳族自治州","普洱市","曲靖市","文山壮族苗族自治州","西双版纳傣族自治州","玉溪市","昭通市"},
{"浙江省","杭州市","湖州市","嘉兴市","金华市","丽水市","宁波市","衢州市","绍兴市","台州市","温州市","舟山市"},
{"重庆市","市辖区","市辖县","县级市"},
{"台湾省","台北市","高雄市","基隆市","台中市","台南市","新竹市","嘉义市"},
};
public static final String[] ipsa={"101.37.166.127","101.37.167.92","101.37.203.79","127.0.0.1"};
static{
initData();
}
private static WhiteValidUtils cityUtils=null;
private WhiteValidUtils(){
}
public static WhiteValidUtils getInstance(){
if(cityUtils==null){
synchronized (WhiteValidUtils.class) {
if(cityUtils==null){
cityUtils=new WhiteValidUtils();
}
}
}
return cityUtils;
}
/**
*
* @Title: initData
* @Description: (初始化白名单数据)
* @param:
* @return: void
* @author xiaozhengwen
* @throws
*/
private static void initData(){
for(int i=0;i<place.length;i++){
provinces.add(place[i][0]);
for(int j=1;j<place[i].length;j++){
citys.add(place[i][j]);
if(place[i][j].contains("市")){
citys.add(place[i][j].replaceAll("市", ""));
}
}
}
//酷车ip访问白名单
for(int i=0;i<ipsa.length;i++){
ips.add(ipsa[i]);
}
}
/**
*
* @Title: validProvince
* @Description: (白名单省份校验)
* @param: @return
* @return: boolean
* @author xiaozhengwen
* @throws
*/
public boolean validProvince(String province){
if(StringUtils.isEmpty(province)){
return false;
}
if(!provinces.contains(province)){
return false;
}
return true;
}
/**
*
* @Title: validCity
* @Description: (白名单城市校验)
* @param: @return
* @return: boolean
* @author xiaozhengwen
* @throws
*/
public boolean validCity(String city){
if(StringUtils.isEmpty(city)){
return false;
}
if(!citys.contains(city)){
return false;
}
return true;
}
/**
*
* @Title: validIP
* @Description: (白名单城市校验)
* @param: @return
* @return: boolean
* @author xiaozhengwen
* @throws
*/
public boolean validIP(String ip){
if(StringUtils.isEmpty(ip)){
return false;
}
logger.info("输入IP地址:==========="+ip);
logger.info("输入ips地址:==========="+ips);
if(!ips.contains(ip)){
return false;
}
return true;
}
}
小结
通常我们让一个全局变量使得一个对象可以被访问。不能防止你实例化多个对象。一个最好的办法是让类自身保存
它自己的唯一实例。这个类可以保证没有其他实例被创建
双重判断的目的是避免在多线程的情况下,第一重判断可以避免在多线程访问的情况下,不影响性能。第二重判断是为了保证单例。