单例模式的定义
单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。
在计算机系统中,还有 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中的对话框、系统中的缓存等常常被设计成单例。
单例模式有 3 个特点:
单例类只有一个实例对象;
该单例对象必须由单例类自行创建;
单例类对外提供一个访问该单例的全局访问点;
单例模式的结构与实现
单例模式是设计模式中最简单的模式之一。通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。
单例模式的实现
public class Student {
//饿汉模式 优点:开始节约了一块存储空间,随着次数越用越多,会降低效率
//private static Student s=new Student();
//懒汉模式
private static Student s;
//私有化构造函数
//直接导致外界无法使用
private Student(){
}
public static Student getStudent(){
if (s==null) {
s=new Student();
}
return s;
}
}
public class test {
Student student= Student.getStudent();
Student student2=Student.getStudent();
}
工厂模式
工厂模式:工厂模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
实例化对象的时候不再使用 new Object()形式,可以根据用户的选择条件来实例化相关的类。对于客户端来说,去除了具体的类的依赖。只需要给出具体实例的描述给工厂,工厂就会自动返回具体的实例对象。
具体实现如下:
- 定义一个操作接口:
public interface Animal {
//动物都有吃东西的方法
public void eat();
}
package FactoryTon;
public class Cat implements Animal {
public void eat() {
System.out.println("猫吃鱼");
}
}
package FactoryTon;
public class Dog implements Animal{
public void eat() {
System.out.println("狗吃猫");
}
}
package FactoryTon;
public class Facoty {
public Animal getAnimal(String name){
if("猫".equals(name)){
return new Cat();
}else if ("狗".equals(name)) {
return new Dog();
}else {
return null;
}
}
}
调用
package FactoryTon;
public class test {
public static void main(String[] args) {
Facoty fa=new Facoty();
Animal an=fa.getAnimal("猫");
an.eat();
Animal an1=fa.getAnimal("狗");
an1.eat();
}
}