急求java设计模式,要求用到两种设计模式 求详细代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急求java设计模式,要求用到两种设计模式 求详细代码相关的知识,希望对你有一定的参考价值。

.饿汉式单例类

//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1
//私有的默认构造子
private Singleton1()
//已经自行实例化
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance()
return single;



2.懒汉式单例类

//懒汉式单例类.在第一次调用的时候实例化
public class Singleton2
//私有的默认构造子
private Singleton2()
//注意,这里没有final
private static Singleton2 single=null;
//静态工厂方法
public synchronized static Singleton2 getInstance()
if (single == null)
single = new Singleton2();

return single;


//对懒汉式单例的改进(错误的改进)
//实际上,只有在第一次创建对象的时候需要加锁,之后就不需要了 ,这样可以提升性能
public synchronized static Singleton2 getInstance()
if (instance == null)
synchronized(instance) //锁住当前实例对象
if(instance == null)
instance = new Singleton2();



return instance;

错误原因:
a>A、B线程同时进入了第一个if判断
b>A首先进入synchronized块,由于instance为null,所以它执行instance = new Singleton();
c>由于JVM内部的优化机制,JVM先画出了一些分配给Singleton实例的空白内存,并赋值给instance成员(注意此时JVM没有开始初始化这个实例),然后A离开了synchronized块。
d>B进入synchronized块,由于instance此时不是null,因此它马上离开了synchronized块并将结果返回给调用该方法的程序。
e>此时B线程打算使用Singleton实例,却发现它没有被初始化,于是错误发生了。

正确改进(使用内部类):
JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的,JVM能够帮我们保证instance只被创建一次,
并且会保证把赋值给instance的内存初始化完毕,这样我们就不用担心上面的问题。
同时该方法也只会在第一次调用的时候使用互斥机制,这样就解决了低性能问题

public?class?Singleton???
??
/*?私有构造方法,防止被实例化?*/??
private?Singleton()


/*?此处使用一个内部类来维护单例?*/??
private?static?class?SingletonFactory???
private?static?Singleton?instance?=?new?Singleton();??


/*?获取实例?*/??
public?static?Singleton?getInstance()???
return?SingletonFactory.instance;??


/*?如果该对象被用于序列化,可以保证对象在序列化前后保持一致?*/??
public?Object?readResolve()???
return?getInstance();??


其实说它完美,也不一定,如果在构造函数中抛出异常,实例将永远得不到创建,也会出错????

第二种改进:
因为我们只需要在创建类的时候进行同步,所以只要将创建和getInstance()分开,
单独为创建加synchronized关键字,也是可以的
public class Singleton
private static Singleton instance=null;
private Singleton()
private static synchronized void Init()
if(instance==null)
instance=new Singletion();

public static Singleton getInstance()
if(instance==null)
Init();

return instance;



3.登记式单例类
import java.util.HashMap;
import java.util.Map;
//登记式单例类.
//类似Spring里面的方法,将类名注册,下次从里面直接获取。
public class Singleton3
private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
static
Singleton3 single = new Singleton3();
map.put(single.getClass().getName(), single);

//保护的默认构造子
protected Singleton3()
//静态工厂方法,返还此类惟一的实例
public static Singleton3 getInstance(String name)
if(name == null)
name = Singleton3.class.getName();
System.out.println("name == null"+"--->name="+name);

if(map.get(name) == null)
try
map.put(name, (Singleton3) Class.forName(name).newInstance());
catch (InstantiationException e)
e.printStackTrace();
catch (IllegalAccessException e)
e.printStackTrace();
catch (ClassNotFoundException e)
e.printStackTrace();


return map.get(name);

//一个示意性的商业方法
public String about()
return "Hello, I am RegSingleton.";

public static void main(String[] args)
Singleton3 single3 = Singleton3.getInstance(null);
System.out.println(single3.about());

参考技术A 抽象工厂模式:
// "AbstractFactory"abstract class AbstractFactory // Methods abstract public AbstractProductA CreateProductA(); abstract public AbstractProductB CreateProductB();// "ConcreteFactory1"class ConcreteFactory1 : AbstractFactory // Methods override public AbstractProductA CreateProductA() return new ProductA1(); override public AbstractProductB CreateProductB() return new ProductB1(); // "ConcreteFactory2"class ConcreteFactory2 : AbstractFactory // Methods override public AbstractProductA CreateProductA() return new ProductA2(); override public AbstractProductB CreateProductB() return new ProductB2(); // "AbstractProductA"abstract class AbstractProductA// "AbstractProductB"abstract class AbstractProductB // Methods abstract public void Interact(AbstractProductA a);// "ProductA1"class ProductA1 : AbstractProductA// "ProductB1"class ProductB1 : AbstractProductB // Methods override public void Interact(AbstractProductA a) Console.WriteLine(this + " interacts with " + a); // "ProductA2"class ProductA2 : AbstractProductA// "ProductB2"class ProductB2 : AbstractProductB // Methods override public void Interact(AbstractProductA a) Console.WriteLine(this + " interacts with " + a); // "Client" - the interaction environment of the productsclass Environment // Fields private AbstractProductA AbstractProductA; private AbstractProductB AbstractProductB; // Constructors public Environment(AbstractFactory factory) AbstractProductB = factory.CreateProductB(); AbstractProductA = factory.CreateProductA(); // Methods public void Run() AbstractProductB.Interact(AbstractProductA); /// <summary>/// ClientApp test environment/// </summary>class ClientApp static void Main(string[] args) AbstractFactory factory1 = new ConcreteFactory1(); Environment e1 = new Environment(factory1); e1.Run(); AbstractFactory factory2 = new ConcreteFactory2(); Environment e2 = new Environment(factory2); e2.Run(); Console.ReadLine();

单例模式
class LazySingleton
//初始为null,暂不实例化
private static LazySingleton instance = null;

//私有的构造子(构造器,构造函数,构造方法)
private LazySingleton()

//公开,静态的工厂方法,需要使用时才去创建该单体
public static LazySingleton getInstance()
if( instance == null )
instance = new LazySingleton();

return instance;


你要的两种,有问题欢迎追问。望采纳!追问

可不可以写个学生登录管理系统的

参考技术B 邮箱告诉我,我给你写一个。追问

1813331504

追答

刚工作忘了,发过去了。查看一下把。

求计算机网络课程设计,采用VC、VB、java或C等编程语言编程实现。题目如下:任选一个

一。聊天室软件的设计与开发:基本要求可以完成群聊、私人聊天,实时发送和显示聊天信息,完成好友列表;进一步要求带表情,附件发送,聊天信息的加密传送,设置黑名单等。
设计提示—学习通信编程Socket接口编程,使用TCP或UDP接口完成信息传送,利用多线程技术实现服务器端的多个TCP连接的建立。

二。网络嗅探器的设计与实现: 基本要求捕获本网段的数据包,将报文结构显示出来.进一步要求进行数据包协议分析,可以按报头进行统计,提取部分关键信息,如捕获登陆信息,破解登陆密码等.
设计提示—查找将网卡设置成混杂模式的方法和函数,按IP数据包的结构提取各部分信息.

参考技术A 我觉得两个都挺简单啊
由于百度只让输10000字,我就不把代码全部贴出来了
我觉得用VB就行啊,用VC更简单,不过有些大材小用了
呵呵,说说思路吧

一:根据用户个数,确定创建的数据库个数
然后给各种类型的数据库以相应字段
比方说如果是私聊,就定比如A向B的信息,B向A的信息,时间等
然后双方向数据库储存数据
双方再定时从数据库读取信息

二:这个小弟愚昧,是不是直接调用DOS就可以了
参考技术B 不全。

以上是关于急求java设计模式,要求用到两种设计模式 求详细代码的主要内容,如果未能解决你的问题,请参考以下文章

java编程语言谁会,下面题目帮解答一下,要详细步骤啊…………谢谢 急急急求……

急求毕业设计问题,stm32中的BOOT0管脚有啥用啊?

急求一份Java课程设计,结课大作业,最近有考试,时间不够,来不及做了。谢谢啦!邮箱573762475@qq.com

求大神帮忙编写一个Java程序显示指定目录中所有的文件和目录,包括文件大小以及类型信息。急求啊!!!

JAVA作业,急求!!!

请问如何调整Linux根目录(/)的空间大小?急求解决办法!!!