1.单例模式
简介:一个类有且仅有一个实例,并且自行实例化向整个系统提供
设计原则:
(1)单例模式的类只提供私有的构造方法
(2) 类定义中含有一个该类的静态私有对象
(3)该类提供了一个静态的公有的方法用于创建获取它本身的静态私有对象
单例模式的三种实现:
(1)懒汉式单例
优点:第一次调用才初始化,避免内存浪费 缺点:必须加synchronized才能保证单例,但加锁会影响效率
public class Student{
private static Stu stu;
private Student(){
}
public static synchronized Student getInstance(){
if(stu == null){
stu = new Student();
}
return stu;
}
}
(2)饿汉式单例
优点:没有加锁,执行效率会提高 缺点:类加载时就初始化,浪费内存
public class ShuiJing{
//不论是否使用,都直接先把这个对象创建好
//private 防止别人访问
// static final 静态常量,不能修改,SJ永远指向的是同一个对象
private static final ShuiJing SJ = new ShuiJing();
private ShuiJing(){}//此类不能被实例化
public static ShuiJing getInstance(){
return SJ;
}
}
(3)登记式单例
内部类只有在外部类被调用才加载,产生SINGLETON实例;又不用加锁。此模式有上述两个模式的优点,屏蔽了它们的缺点,是最好的单例模式
public class Student{
private Student(){}
//构造方法是私有的,从而避免外界利用构造方法直接创建任意多实例
public static Student createObj(){
return Holder.stu;
}
//私有的静态内部类
private static class Holder{
private static final Student stu = new Student();
}
}
2.模板设计模式
(1)优点和缺点
优点: 1.模板方法模式通过把不变的行为定义父类中, 去除了子类的重复代码(提高代码的复用性)
2. 子类实现算法的某些细节,有助于算法的扩展
3. 通过一个父类调用子类实现的操作,通过子类扩展新的行为(方法) 缺点: 每个不同的实现都需要定义一个子类,随着子类的个数的增加,设计比较混乱
代码:
package tempaltemethod;
public abstract class Model {
public abstract boolean login(String uname,String upwd);
}
package tempaltemethod;
public class QQ extends Model {
@Override
public boolean login(String uname, String upwd) {
if("10000".equals(uname) && "123456".equals(upwd)) {
return true;
}
return false;
}
}
package tempaltemethod;
public class Wechat extends Model {
@Override
public boolean login(String uname, String upwd) {
if ("15871391676".equals(uname) && "123456".equals(upwd)) {
return true;
}return false;
}
}
package tempaltemethod;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
System.out.println("xxx游戏");
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("请选择登录方式: 1.QQ 2.微信");
int cmd = sc.nextInt();
Model model=null;
String uname=null;
String upwd=null;
switch (cmd) {
case 1:
model=new QQ();
System.out.println("请输入qq账号和密码");
uname=sc.next();
upwd=sc.next();
break;
case 2:
model=new Wechat();
System.out.println("请输入微信账号和密码");
uname=sc.next();
upwd=sc.next();
break;
default:
System.out.println("只有1和2两个选择,没有其他选项!");
continue;
}
boolean flag=model.login(uname, upwd);
System.out.println("是否登录成功"+flag);
break;
}
}
}
1185

被折叠的 条评论
为什么被折叠?



