代码设计模式
A. 下面的代码实现了设计模式中的什么模式
一共23种设计模式! 引用《软件秘笈-设计模式那点事》书籍: 按照目的来分,设计模... == null) { singleton = new Singleton(); }
B. 判断以下代码的设计模式
肯定是结构型模式的一种。
从样子,可以是适配器模式、装饰模式、桥接模式、组合模式等等
事实上这些模式从表现上来看(类的继承结构),都是基本一致的,但他们的动机以及侧重点不同,因此很难从这段代码上看出来确切是哪一种模式在使用。
如果能够提供一些类的功能或者动机上的信息,判断它所用的模式可能会更加容易。。
C. 急求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());
}
}
D. 求一个含10种java设计模式的源代码
具体要求:
1、项目概述:主要阐述项目的功能
2、概要设计:各个类的功能说明和成员函数功能说明以及类层次图,重点要阐述设计各个类时,所使用的设计模式和各个模式下的类结构图。
3、算法描述或程序流程图描述
4、关键代码说明
5、运行与测试
。。。。。。。。还可以有其他部分
6、项目总结
发我邮箱 [email protected]
E. java 流程式代码适合什么设计模式
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
二、设计模式的六大原则
1、开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2、里氏代换原则(Liskov Substitution Principle)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Bai 网络
3、依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。
5、迪米特法则(最少知道原则)(Demeter Principle)
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承。
F. 你熟悉的设计模式有哪些写出单例模式的实现代码
23个设计模式:
根据目的设计模式可以分为创造模式,结构模式和行为模式,创建模式用于处理对象的创建。结构模式用于处理类或对象的组合。
行为模式用于描述类或对象如何交互以及如何分配职责,创建模式用于处理对象的创建。主要包括以下五种设计模式:
工厂方法模式()
抽象工厂模式(AbstractFactoryPattern)
建造者模式(BuilderPattern)
原型模式(PrototypePattern)
单例模式(SingletonPattern)
结构模式用于处理类或对象的组合,包括以下七个设计模式:
适配器模式(AdapterPattern)
桥接模式(BridgePattern)
组合模式(CompositePattern)
装饰者模式(DecoratorPattern)
外观模式(FacadePattern)
享元模式(FlyweightPattern)
代理模式(ProxyPattern)
行为模式描述类或对象如何交互以及它们如何分配职责。它由以下11种设计模式组成:
责任链模式(Chain的ResponsibilityPattern)
命令模式(CommandPattern)
解释器模式(InterpreterPattern)
迭代器模式(IteratorPattern)
中介者模式(MediatorPattern)
备忘录模式(MementoPattern)
观察者模式(ObserverPattern)
状态模式(StatePattern)
策略模式(StrategyPattern)
模板方法模式(TemplateMethodPattern)
访问者模式(VisitorPattern)
单例模式实现1:
公共类Singleton{
类共享实例对象
私有静态单例;单例=零;
//私有构造函数
私有Singleton(){
系统。出去了。这是单例!!);
}
//获取单例方法
公共同步静态单例getInstance(){
//确定共享对象是否为空,如何空一个新对象
If(singleton==null){
singleton=newsingleton();
}
返回单例。
}
}
单例模式实现2:
公共类Singleton{
类共享实例对象实例化
=newSingleton();
//私有构造函数
私有Singleton(){
系统:出去了,这是单例!!);
}
//获取单例方法
公共静态单例getInstance(){
直接返回共享对象
返回单例。
}
}
(6)代码设计模式扩展阅读:
注意事项:
设计模式主要分三个类型:创建型和行为型。
Singleton:确保一个类只有一个实例,并为其提供一个全局访问点
AbstractFactory:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。
FactoryMethod:定义一个用于创建对象的接口,并让子类决定实例化哪个类。工厂方法将类的实例化延迟到子类。
Builder:将复杂对象的构造与其表示分离,使相同的构造过程可以创建不同的表示。
Prototype:指定要使用Prototype实例创建的对象的类型,并复制该原型来创建一个新对象。
Composite:将对象组合成树状结构,以表示整体各部分之间的关系。组合使用户一致地使用单个对象和组合对象。
Facade:为子系统fa中的一组接口提供一致的接口。Ade提供了一个高级接口,使子系统更易于使用。
Proxy:为其他对象提供一个代理,以控制对该对象的访问
Adapter:将一个接口类转换为客户想要的另一个接口类。适配器模式使那些由于接口不兼容而无法一起工作的类一起工作。
Decrator:式比子类化更灵活,可以为对象动态添加一些额外的职责。
Bridge:模式将抽象部分与其实现部分分离,以便它们可以独立地更改。
Flyweight:享元模式
G. Java写一套漂亮的代码,哪些设计模式比较常用
对于代码结构上,看起来漂亮起作用的模式,常用的策略模式,工厂模式,装饰模式和观察者模式吧。但也看情景,生搬硬套会显得不够简洁的
H. web前端常见的代码设计模式有哪些
常见代码 function CreatePerson(name,age,sex) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.sex = sex;
obj.sayName = function(){
return this.name;
}
return obj;
}
var p1 = new CreatePerson("longen",'28','男');
var p2 = new CreatePerson("tugenhua",'27','女');
console.log(p1.name); // longen
console.log(p1.age); // 28
console.log(p1.sex); // 男
console.log(p1.sayName()); // longen
console.log(p2.name); // tugenhua
console.log(p2.age); // 27
console.log(p2.sex); // 女
console.log(p2.sayName()); // tugenhua
// 返回都是object 无法识别对象的类型 不知道他们是哪个对象的实列
console.log(typeof p1); // object
console.log(typeof p2); // object
console.log(p1 instanceof Object);