package ray;
//饿汉式单例:优点:线程安全,缺点:加载类的时候如果创建对象很费时,类的加载会很慢很慢…
// 1)封装构造器,封死new操作
// 2)声明私有的静态属性,指向本类对象的一个引用,并同时创建唯一对象,并让静态引用指向这个唯一对象
// 3)声明公共的静态方法,用以获取唯一对象
//懒汉式单例:优点:把对象的创建延迟了,提高了效率,缺点:因为有可能有线程安全问题
// 1)封装构造器
// 2)声明私有的静态属性,指向本类对象的一个引用,并不创建对象
// 3)声明公共的静态方法,用以获取唯一对象,在方法中如果是第一次调用才创建对象
class Singleton1{
private static Singleton1 only = new Singleton1();
public static Singleton1 getInstance() {
return only;
}
private Singleton1() {
}
}
class Singleton2{
private static Singleton2 only = null;
public static Singleton2 getInstance() {
if(only == null)//第一次调用此方法
only = new Singleton2();
return only;
}
}
public class SingletonTest {
public static void main(String[] args) {
Singleton1 s1 = Singleton1.getInstance();
Singleton1 s2 = Singleton1.getInstance();
System.out.println(s1 == s2);
}
}
package ray;
//工厂方法
//定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。
//适用性:1当一个类不知道它所必须创建的对象的类的时候
// 2当一个类希望由它的子类来指定它所创建的对象的时候
// 3当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候
interface Worker{
void work();
}
class Teacher implements Worker{
public void work() {
System.out.println(“老师的工作就是上课”);
}
}
class Student implements Worker{
public void work() {
System.out.println(“学生的工作是学习”);
}
}
class ObjectFactory{//简化创建老师的过程
public static Teacher getTeacher() {
return new Teacher();
}
public Student getStudent() {
return new Student();
}
public Worker getTeacher1() {
return new Teacher();
}
}
public class FactoryTest {
public static void main(String[] args) {
//静态与非静态方法调用
ObjectFactory factory = new ObjectFactory();
Teacher teacher = ObjectFactory.getTeacher();
teacher.work();
Worker worker1 = factory.getTeacher1();
worker1.work();//用接口屏蔽子类细节
Student student = factory.getStudent();
student.work();
}
}
/*代理模式:
- 场景一:用户无法直接接触到被代理对象
- 场景二:方法功能要升级,但是不能改变被代理类
*/
interface HouseRent{
void rent();
}
class FangDong implements HouseRent{//被代理对象
@Override
public void rent() {
System.out.println(“我有房子要出租”);
}
}
class FangDong2 implements HouseRent{//被代理对象
@Override
public void rent() {
System.out.println(“我有房子要出租,漏水漏电”);
}
}
class LianJia implements HouseRent{
private HouseRent hr = new FangDong();//控制哪个房东
@Override
public void rent() {
System.out.println("请交中介费20000");
//使房东的房子真的出租
hr.rent();
System.out.println("及时交房租,交房租可以使用微信支付宝");//方法升级
}
}
public class EnumTest {
public static void main(String[] args) {
//想租房子
HouseRent hr = new LianJia();
hr.rent();
}
}