⾯试中常⽤设计模式
设计模式的优点
设计模式可在多个项⽬中重⽤。
设计模式提供了⼀个帮助定义系统架构的解决⽅案。
设计模式吸收了软件⼯程的经验。
设计模式为应⽤程序的设计提供了透明性。
设计模式是被实践证明切实有效的,由于它们是建⽴在专家软件开发⼈员的知识和经验之上的。
单例模式
单例模式的写法有好⼏种,这⾥主要介绍三种:懒汉式单例、饿汉式单例
单例模式有以下特点:
  1、单例类只能有⼀个实例。
  2、单例类必须⾃⼰创建⾃⼰的唯⼀实例。
  3、单例类必须给所有其他对象提供这⼀实例。
单例模式确保某个类只有⼀个实例,⽽且⾃⾏实例化并向整个系统提供这个实例。
总之,选择单例模式就是为了避免不⼀致状态,避免政出多头。
⼀、懒汉式单例
//懒汉式单例类.在第⼀次调⽤的时候实例化⾃⼰
public class Singleton{
private Singleton(){}
private static Singleton single=null;
//静态⼯⼚⽅法
public static Singleton getInstance(){
if(single ==null){
single =new Singleton();
}
return single;
}
}
Singleton通过将构造⽅法限定为private避免了类在外部被实例化,在同⼀个虚拟机范围内,Singleton的唯⼀实例只能通过getInstance()⽅法访问。
实现线程安全:
线程安全⼀:
在getInstace⽅法上加同步
⽅法调⽤上加了同步,虽然线程安全了,但是每次都要同步,
会影响性能,毕竟99%的情况下是不需要同步的
public static synchronized Singleton getInstance(){
if(single ==null){
single =new Singleton();
}
return single;
}
线程安全⼆:
线程安全⼆:双重检查锁定
在getInstance中做了两次null检查,
确保了只有第⼀次调⽤单例的时候才会做同步,
这样也是线程安全的,同时避免了每次都同步的性能损耗
public static Singleton getInstance(){
if(single ==null){
synchronized (Singleton.class){
if(single ==null){
single =new Singleton();
}
}
}
return singleton;
}
线程安全三:
静态内部类
既实现线程安全⼜避免同步带来的影响
利⽤了classloader的机制来保证初始化instance时只有⼀个线程
public class Singleton{
private static class LazyHolder{
private static final Singleton INSTANCE =new Singleton();
}
private Singleton (){}
public static final Singleton getInstance(){
return LazyHolder.INSTANCE;
}
}
⼆、饿汉式单例
final:保证天⽣线程安全
//饿汉式单例类.在类初始化时,已经⾃⾏实例化
public class Singleton1{
private Singleton1(){}
private static final Singleton1 single =new Singleton1();
//静态⼯⼚⽅法
public static Singleton1getInstance(){
return single;
}
}
⼯⼚模式
介绍:
1)还没有⼯⼚时代:假如还没有⼯业⾰命,如果⼀个客户要⼀款宝马车,⼀般的做法是客户去创建⼀款宝马车,然后拿来⽤。
2)简单⼯⼚模式:后来出现⼯业⾰命。⽤户不⽤去创建宝马车。因为客户有⼀个⼯⼚来帮他创建宝马.想要什么车,这个⼯⼚就可以建。⽐如想要320i系列车。⼯⼚就创建这个系列的车。即⼯⼚可以创建产品。
3)⼯⼚⽅法模式时代:为了满⾜客户,宝马车系列越来越多,如320i,523i,30li等系列⼀个⼯⼚⽆法创建所有的宝马系列。于是由单独分出来多个具体的⼯⼚。每个具体⼯⼚创建⼀种系列。即具体⼯⼚类只能创建⼀个具体产品。但是宝马⼯⼚还是个抽象。你需要指定某个具体的⼯⼚才能⽣产车出来。
4)抽象⼯⼚模式时代:随着客户的要求越来越⾼,宝马车必须配置空调。于是这个⼯⼚开始⽣产宝马车和需要的空调。
最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。⽽不⽤⾃⼰去创建523i空调车宝马车.
分类:
1)简单⼯⼚模式(Simple Factory)
2)⼯⼚⽅法模式(Factory Method)java中常用的设计模式有哪些
3)抽象⼯⼚模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具⼀般性。
也可以 将简单⼯⼚模式(Simple Factory)看为⼯⼚⽅法模式的⼀种特例,两者归为⼀类。分别:⼯⼚⽅法模式(Factory Method)与抽象⼯⼚模式(Abstract Factory)。
⼯⼚⽅法模式:
⼀个抽象产品类,可以派⽣出多个具体产品类。
⼀个抽象⼯⼚类,可以派⽣出多个具体⼯⼚类。
每个具体⼯⼚类只能创建⼀个具体产品类的实例。
抽象⼯⼚模式:
多个抽象产品类,每个抽象产品类可以派⽣出多个具体产品类。
⼀个抽象⼯⼚类,可以派⽣出多个具体⼯⼚类。
每个具体⼯⼚类可以创建多个具体产品类的实例。
区别:
⼯⼚⽅法模式只有⼀个抽象产品类,⽽抽象⼯⼚模式有多个。
⼯⼚⽅法模式的具体⼯⼚类只能创建⼀个具体产品类的实例,⽽抽象⼯⼚模式可以创建多个。两者皆可。
简单⼯⼚模式
产品类:
abstract class BMW{
public BMW(){
}
}
public class BMW320 extends BMW {
public BMW320(){
System.out.println("制造-->BMW320");
}
}
public class BMW523 extends BMW{
public BMW523(){
System.out.println("制造-->BMW523");
}
}
⼯⼚类:
public BMW createBMW(int type){
switch(type){
case320:
return new BMW320();
case523:
return new BMW523();
default:
break;
}
return null;
}
}
客户类:
public class Customer{
public static void main(String[] args){
Factory factory =new Factory();
BMW bmw320 = ateBMW(320);
BMW bmw523 = ateBMW(523);
}
}
⼯⼚⽅法模式
⼯⼚⽅法模式去掉了简单⼯⼚模式中⼯⼚⽅法的静态属性,使得它可以被⼦类继承。这样在简单⼯⼚模式⾥集中在⼯⼚⽅法上的压⼒可以由⼯⼚⽅法模式⾥不同的⼯⼚⼦类来分担。
⼯⼚⽅法模式组成:
1)抽象⼯⼚⾓⾊: 这是⼯⼚⽅法模式的核⼼,它与应⽤程序⽆关。是具体⼯⼚⾓⾊必须实现的接⼝或者必须继承的⽗类。在java中它由抽象类或者接⼝来实现。
2)具体⼯⼚⾓⾊:它含有和具体业务逻辑有关的代码。由应⽤程序调⽤以创建对应的具体产品的对象。
3)抽象产品⾓⾊:它是具体产品继承的⽗类或者是实现的接⼝。在java中⼀般有抽象类或者接⼝来实现。
4)具体产品⾓⾊:具体⼯⼚⾓⾊所创建的对象就是此⾓⾊的实例。在java中由具体的类来实现。
⼯⼚⽅法模式使⽤继承⾃抽象⼯⼚⾓⾊的多个⼦类来代替简单⼯⼚模式中的“上帝类”。正如上⾯所说,这样便分担了对象承受的压⼒;⽽且这样使得结构变得灵活 起来——当有新的产品产⽣时,只要按照抽象产品⾓⾊、抽象⼯⼚⾓⾊提供的合同来⽣成,那么就可以被客户使⽤,⽽不必去修改任何已有 的代码。
产品类:
abstract class BMW{
public BMW(){
}
}
public class BMW320 extends BMW {
public BMW320(){
System.out.println("制造-->BMW320");
}
}
public class BMW523 extends BMW{
public BMW523(){
System.out.println("制造-->BMW523");
}
}
创建⼯⼚类:
BMW createBMW();
}
public class FactoryBMW320 implements FactoryBMW{
@Override
public BMW320createBMW(){
return new BMW320();
}
}
public class FactoryBMW523 implements FactoryBMW {
@Override
public BMW523createBMW(){
return new BMW523();
}
}
客户类:
public class Customer{
public static void main(String[] args){
FactoryBMW320 factoryBMW320 =new FactoryBMW320();
BMW320 bmw320 = ateBMW();
FactoryBMW523 factoryBMW523 =new FactoryBMW523();
BMW523 bmw523 = ateBMW();
}
}
抽象⼯⼚模式
抽象⼯⼚模式是⼯⼚⽅法模式的升级版本,他⽤来创建⼀组相关或者相互依赖的对象。⽐如宝马320系列使⽤空调型号A和发动机型号A,⽽宝马230系列使⽤空调型号B和发动机型号B,那么使⽤抽象⼯⼚模式,在为320系列⽣产相关配件时,就⽆需制定配件的型号,它会⾃动根据车型⽣产对应的配件型号A。
产品类:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。