Java⾯试常见设计模式(根据⾯经不断更新)
设计模式的分类(共23种)
总体来说设计模式分为三⼤类:
创建型模式,共五种:⼯⼚⽅法模式、抽象⼯⼚模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
⾏为型模式,共⼗⼀种:策略模式、模板⽅法模式、观察者模式、迭代⼦模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
1、⼯⼚⽅法模式(Factory Method)
java中常用的设计模式有哪些⼯⼚⽅法模式分为三种:
1.1普通⼯⼚模式,就是建⽴⼀个⼯⼚类,对实现了同⼀接⼝的⼀些类进⾏实例的创建。(通过字符串名⽣成对象)
/
/创建共同接⼝
public interface Sender {
public void Send();
}
//创建实现类
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mailsender!");
}
}
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
//建⼯⼚类
public class SendFactory {
public Sender produce(String type) {
if ("mail".equals(type)) {
return new MailSender();
} else if ("sms".equals(type)) {
return new SmsSender();
} else {
System.out.println("请输⼊正确的类型!");
return null;
}
}
}
//测试
public class FactoryTest {
public static void main(String[] args) {
SendFactory factory = new SendFactory();
Sender sender = factory.produce("sms");
sender.Send();
}
}
1.2多个⼯⼚⽅法模式,是对普通⼯⼚⽅法模式的改进,在普通⼯⼚⽅法模式中,如果传递的字符串出错,则不能正确创建对象,⽽多个⼯⼚⽅法模式是提供多个⼯⼚⽅法,分别创建对象。修改以上的SendFactory类即可;(通过⼯⼚⽅法⽣成对象)
//⼯⼚类中多种⽅法⽣成对象
public class SendFactory {
public Sender produceMail(){
return new MailSender();
}
public Sender produceSms(){
return new SmsSender();
}
}
//测试类
public class FactoryTest {
public static void main(String[] args) {
SendFactory factory = new SendFactory();
Sender sender = factory.produceMail();
sender.Send();
}
}
1.3静态⼯⼚⽅法模式,将上⾯的多个⼯⼚⽅法模式⾥的⽅法置为静态的,不需要创建实例,直接调⽤即可。
public class SendFactory {
public static Sender produceMail(){
return new MailSender();
}
public static Sender produceSms(){
return new SmsSender();
}
}
//测试类
public class FactoryTest {
public static void main(String[] args) {
Sender sender = SendFactory.produceMail();
sender.Send();
}
}
2、抽象⼯⼚模式(Abstract Factory)
简单的说,相⽐较⼯⼚⽅法模式,区别主要是增加了⼯⼚类接⼝,可以定义多个⼯⼚实现类;其实这个模式的好处就是,如果你现在想增加⼀个功能:发及时信息,则只需做⼀个实现类,实现Sender接⼝,同时做⼀个⼯⼚类,实现Provider接⼝,就OK了,⽆需去改动现成的代码。这样做,拓展性较好!
//⽬标对象接⼝
public interface Sender {
public void Send();
}
//⽬标对象类
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mailsender!");
}
}
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
//⼯⼚类接⼝
public interface Provider {
public Sender produce();
}
//⼯⼚类
public class SendMailFactory implements Provider {
@Override
public Sender produce(){
return new MailSender();
}
}
public class SendSmsFactory implements Provider{
@Override
public Sender produce() {
return new SmsSender();
}
}
/
/测试类
public class Test {
public static void main(String[] args) {
Provider provider = new SendMailFactory();
Sender sender = provider.produce();
sender.Send();
}
}
3、单例模式(Singleton)
单例对象(Singleton)是⼀种常⽤的设计模式。在Java应⽤中,单例对象能保证在⼀个JVM中,该对象只有⼀个实例存在。
public class Singleton {
/* 持有私有静态实例,防⽌被引⽤,此处赋值为null,⽬的是实现延迟加载 */
private static Singleton instance = null;
/* 私有构造⽅法,防⽌被实例化 */
private Singleton() {
}
/* 静态⼯程⽅法,创建实例 */
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
/* 如果该对象被⽤于序列化,可以保证对象在序列化前后保持⼀致 */
public Object readResolve() {
return instance;
}
}
4、代理模式(Proxy)
代理模式给某⼀个对象提供⼀个代理对象,并由代理对象控制对原对象的引⽤。
中介隔离作⽤:在某些情况下,⼀个客户类不想或者不能直接引⽤⼀个委托对象,⽽代理类对象可以在客户类和委托对象之间起到中介的作⽤,其特征是代理类和委托类实现相同的接⼝。
开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类⽽不需要再修改委托类,符合代码设计的开闭
原则。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本⾝并不真正实现服务,⽽是调⽤通过委托类的相关⽅法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执⾏的前后加⼊⼀些公共的服务。例如我们想给项⽬加⼊缓存、⽇志这些功能,我们就可以使⽤代理类来完成,⽽没必要打开已经封装好的委托类。
//⽬的对象接⼝
public interface Sourceable {
public void method();
}
//委托类
public class Source implements Sourceable {
@Override
public void method() {
System.out.println("the original method!"); }
}
//代理类
public class Proxy implements Sourceable {
private Source source;
public Proxy(){
super();
this.source = new Source();
}
@Override
public void method() {
before();
atfer();
}
private void atfer() {
System.out.println("after proxy!");
}
private void before() {
System.out.println("before proxy!");
}
}
/
/测试类
public class ProxyTest {
public static void main(String[] args) {
Sourceable source = new Proxy();
}
}
<
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论