问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-22 08:42

我来回答

3个回答

热心网友 时间:2022-04-06 07:13

.饿汉式单例类

//饿汉式单例类.在类初始化时,已经自行实例化
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());
}
}

热心网友 时间:2022-04-06 08:31

抽象工厂模式:
// "AbstractFactory"abstract class AbstractFactory{ // Methods abstract public AbstractProctA CreateProctA(); abstract public AbstractProctB CreateProctB();}// "ConcreteFactory1"class ConcreteFactory1 : AbstractFactory{ // Methods override public AbstractProctA CreateProctA() { return new ProctA1(); } override public AbstractProctB CreateProctB() { return new ProctB1(); }}// "ConcreteFactory2"class ConcreteFactory2 : AbstractFactory{ // Methods override public AbstractProctA CreateProctA() { return new ProctA2(); } override public AbstractProctB CreateProctB() { return new ProctB2(); }}// "AbstractProctA"abstract class AbstractProctA{}// "AbstractProctB"abstract class AbstractProctB{ // Methods abstract public void Interact(AbstractProctA a);}// "ProctA1"class ProctA1 : AbstractProctA{}// "ProctB1"class ProctB1 : AbstractProctB{ // Methods override public void Interact(AbstractProctA a) { Console.WriteLine(this + " interacts with " + a); }}// "ProctA2"class ProctA2 : AbstractProctA{}// "ProctB2"class ProctB2 : AbstractProctB{ // Methods override public void Interact(AbstractProctA a) { Console.WriteLine(this + " interacts with " + a); }}// "Client" - the interaction environment of the proctsclass Environment{ // Fields private AbstractProctA AbstractProctA; private AbstractProctB AbstractProctB; // Constructors public Environment(AbstractFactory factory) { AbstractProctB = factory.CreateProctB(); AbstractProctA = factory.CreateProctA(); } // Methods public void Run() { AbstractProctB.Interact(AbstractProctA); }}/// <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;
}
}
你要的两种,有问题欢迎追问。望采纳!追问可不可以写个学生登录管理系统的

热心网友 时间:2022-04-06 10:06

邮箱告诉我,我给你写一个。追问1813331504

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

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 设计模式 c++ 源代码 举例 java-接口的代理设计模式 请给我解释一下java中单例设计模式和享元设计模式... spring中使用了哪些经典设计模式,举例说明 JAVA使用设计模式之组合模式? 设计模式与算法有什么区别请详细说明一下 java面向对象设计原则和设计模式详解 android中常用的设计模式有哪些 编程里面的设计模式到底有多少种?谁能详细告诉我~... 好听的小说中的男生、女生的名字(各10个) 怎么用扑克牌占卜 有哪些好听的名字?要女生和男生的 java设计模式有哪些 我要12个好听的男生名字和1个好听的女生名字 《设计模式解析第二版》pdf下载在线阅读全文,求百... 仓鼠被踩到了奄奄一息怎么救 库洛牌占卜详细的方法 请问这是什么果果? 急需好听中国人名字25个男生名和25个女生名。 肠虫宁给狗狗吃完后拉稀呕吐是怎么回事? 抽象工厂设计模式的应用场景---详细都有哪些?及求... java多线程设计模式详解 哪能下载 列举至少5种EJB设计模式 精神科疾疾会盗汗遗精吗 dao设计模式中vo、pojo这些对象如何使用,以及他们... 精神科疾病预防的可行方案? 心理精神科疾病在现在的社会还是受歧视吗? 百度帐号因安全问题已被限制登录 青春期精神分裂症能治好吗 精神分裂的易发人群有哪些呢? 精神分裂症是什么症状?? 账号被限制登录是怎么回事 点中医吃能根治精神分裂症吗 手游幸运大转盘抽奖有哪些技巧 手机上qq有的人发说说就会提醒我,怎么取消它? 南京哪里看精神疾病较好?求助 我是该去看精神科还是怎么? 手机QQ可以设置某个好友发说说就提示我的吗? 有的微信公众号里面有幸运大转盘能抽奖,这是什么... QQ特别关心对方发说说会提醒吗