了解java设计模式:常用的7种设计模式简介,需要具体代码示例
java设计模式是一种解决软件设计问题的通用解决方案,它提供了一套被广泛接受的设计思想与行为准则。设计模式帮助我们更好地组织和规划代码结构,使得代码具有更好的可维护性、可读性和可扩展性。在本文中,我们将介绍java中常用的7种设计模式,并提供相应的代码示例。
单例模式(singleton pattern):
单例模式保证一个类只有一个实例,并提供一个全局访问点。这在需要共享资源或限制对象个数的场景中非常有用。下面是一个单例模式的代码示例:public class singleton { private static singleton instance; private singleton() { // 私有构造函数,防止外部实例化 } public static singleton getinstance() { if (instance == null) { synchronized (singleton.class) { if (instance == null) { instance = new singleton(); } } } return instance; }}
工厂模式(factory pattern):
工厂模式通过一个工厂类来创建对象,封装了对象的创建过程。这可以隐藏对象的具体实现细节,使得客户端的代码更加简洁和可扩展。下面是一个工厂模式的代码示例:public interface shape { void draw();}public class circle implements shape { @override public void draw() { system.out.println("circle::draw()"); }}public class rectangle implements shape { @override public void draw() { system.out.println("rectangle::draw()"); }}public class shapefactory { public shape getshape(string shapetype) { if (shapetype == null) { return null; } if (shapetype.equalsignorecase("circle")) { return new circle(); } else if (shapetype.equalsignorecase("rectangle")) { return new rectangle(); } return null; }}
观察者模式(observer pattern):
观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生变化时,依赖于它的其他对象将自动更新。这在事件驱动、发布-订阅,以及gui开发中非常有用。下面是一个观察者模式的代码示例:import java.util.arraylist;import java.util.list;public class subject { private list<observer> observers = new arraylist<>(); private int state; public int getstate() { return state; } public void setstate(int state) { this.state = state; notifyallobservers(); } public void attach(observer observer) { observers.add(observer); } public void notifyallobservers() { for (observer observer : observers) { observer.update(); } }}public abstract class observer { protected subject subject; public abstract void update();}public class binaryobserver extends observer { public binaryobserver(subject subject) { this.subject = subject; this.subject.attach(this); } public void update() { system.out.println("binary string: " + integer.tobinarystring(subject.getstate())); }}public class octalobserver extends observer { public octalobserver(subject subject) { this.subject = subject; this.subject.attach(this); } public void update() { system.out.println("octal string: " + integer.tooctalstring(subject.getstate())); }}public class hexobserver extends observer { public hexobserver(subject subject) { this.subject = subject; this.subject.attach(this); } public void update() { system.out.println("hex string: " + integer.tohexstring(subject.getstate())); }}public class observerpatterndemo { public static void main(string[] args) { subject subject = new subject(); new binaryobserver(subject); new octalobserver(subject); new hexobserver(subject); system.out.println("first state change: 15"); subject.setstate(15); system.out.println("second state change: 10"); subject.setstate(10); }}
建造者模式(builder pattern):
建造者模式通过将对象的构建过程分离,使得相同的构建过程可用于创建不同的表示。这可以提高代码的灵活性和可读性,并且可以避免构建参数过多的问题。下面是一个建造者模式的代码示例:public class computer { private string cpu; private string memory; private string disk; // 省略其他属性和方法}public interface computerbuilder { computerbuilder setcpu(string cpu); computerbuilder setmemory(string memory); computerbuilder setdisk(string disk); computer build();}public class basiccomputerbuilder implements computerbuilder { private computer computer; public basiccomputerbuilder() { computer = new computer(); } public computerbuilder setcpu(string cpu) { computer.setcpu(cpu); return this; } public computerbuilder setmemory(string memory) { computer.setmemory(memory); return this; } public computerbuilder setdisk(string disk) { computer.setdisk(disk); return this; } public computer build() { return computer; }}public class director { private computerbuilder computerbuilder; public director(computerbuilder computerbuilder) { this.computerbuilder = computerbuilder; } public computer construct() { return computerbuilder .setcpu("i5") .setmemory("8gb") .setdisk("1tb") .build(); }}public class builderpatterndemo { public static void main(string[] args) { computerbuilder computerbuilder = new basiccomputerbuilder(); director director = new director(computerbuilder); computer computer = director.construct(); system.out.println(computer.tostring()); }}
原型模式(prototype pattern):
原型模式通过复制现有对象来创建新对象,而不是重新创建。这可以提高对象的创建效率,尤其是在对象的初始化过程比较复杂时。下面是一个原型模式的代码示例:public abstract class shape implements cloneable { private string id; protected string type; abstract void draw(); public string getid() { return id; } public void setid(string id) { this.id = id; } public object clone() { object clone = null; try { clone = super.clone(); } catch (clonenotsupportedexception e) { e.printstacktrace(); } return clone; }}public class circle extends shape { public circle() { type = "circle"; } public void draw() { system.out.println("inside circle::draw() method."); }}public class rectangle extends shape { public rectangle() { type = "rectangle"; } public void draw() { system.out.println("inside rectangle::draw() method."); }}public class shapecache { private static map<string, shape> shapemap = new hashmap<>(); public static shape getshape(string shapeid) { shape cachedshape = shapemap.get(shapeid); return (shape) cachedshape.clone(); } public static void loadcache() { circle circle = new circle(); circle.setid("1"); shapemap.put(circle.getid(), circle); rectangle rectangle = new rectangle(); rectangle.setid("2"); shapemap.put(rectangle.getid(), rectangle); }}public class prototypepatterndemo { public static void main(string[] args) { shapecache.loadcache(); shape clonedshape1 = shapecache.getshape("1"); system.out.println("shape: " + clonedshape1.gettype()); shape clonedshape2 = shapecache.getshape("2"); system.out.println("shape: " + clonedshape2.gettype()); }}
适配器模式(adapter pattern):
适配器模式将一个类的接口转换成客户端所期望的另一个接口。这可以在不改变现有代码的情况下,为不兼容的接口之间提供协同工作的能力。下面是一个适配器模式的代码示例:public interface mediaplayer { void play(string audiotype, string filename);}public interface advancedmediaplayer { void playvlc(string filename); void playmp4(string filename);}public class vlcplayer implements advancedmediaplayer { public void playvlc(string filename) { system.out.println("playing vlc file. name: " + filename); } public void playmp4(string filename) { // 空实现 }}public class mp4player implements advancedmediaplayer { public void playvlc(string filename) { // 空实现 } public void playmp4(string filename) { system.out.println("playing mp4 file. name: " + filename); }}public class mediaadapter implements mediaplayer { advancedmediaplayer advancedmediaplayer; public mediaadapter(string audiotype) { if (audiotype.equalsignorecase("vlc")) { advancedmediaplayer = new vlcplayer(); } else if (audiotype.equalsignorecase("mp4")) { advancedmediaplayer = new mp4player(); } } public void play(string audiotype, string filename) { if (audiotype.equalsignorecase("vlc")) { advancedmediaplayer.playvlc(filename); } else if (audiotype.equalsignorecase("mp4")) { advancedmediaplayer.playmp4(filename); } }}public class audioplayer implements mediaplayer { mediaadapter mediaadapter; public void play(string audiotype, string filename) { if (audiotype.equalsignorecase("mp3")) { system.out.println("playing mp3 file. name: " + filename); } else if (audiotype.equalsignorecase("vlc") || audiotype.equalsignorecase("mp4")) { mediaadapter = new mediaadapter(audiotype); mediaadapter.play(audiotype, filename); } else { system.out.println("invalid media. " + audiotype + " format not supported"); } }}public class adapterpatterndemo { public static void main(string[] args) { audioplayer audioplayer = new audioplayer(); audioplayer.play("mp3", "beyond_the_horizon.mp3"); audioplayer.play("mp4", "alone.mp4"); audioplayer.play("vlc", "far_far_away.vlc"); audioplayer.play("avi", "mind_me.avi"); }}
策略模式(strategy pattern):
策略模式定义了一系列的算法,并将每个算法封装起来,使得它们可以互相替换。这样可以方便地切换算法或扩展新的算法,而不影响其他部分的代码。下面是一个策略模式的代码示例:public interface strategy { int dooperation(int num1, int num2);}public class operationadd implements strategy { public int dooperation(int num1, int num2) { return num1 + num2; }}public class operationsubtract implements strategy { public int dooperation(int num1, int num2) { return num1 - num2; }}public class operationmultiply implements strategy { public int dooperation(int num1, int num2) { return num1 * num2; }}public class context { private strategy strategy; public context(strategy strategy) { this.strategy = strategy; } public int executestrategy(int num1, int num2) { return strategy.dooperation(num1, num2); }}public class strategypatterndemo { public static void main(string[] args) { context context = new context(new operationadd()); system.out.println("10 + 5 = " + context.executestrategy(10, 5)); context = new context(new operationsubtract()); system.out.println("10 - 5 = " + context.executestrategy(10, 5)); context = new context(new operationmultiply()); system.out.println("10 * 5 = " + context.executestrategy(10, 5)); }}
通过以上示例代码,我们对java中常用的7种设计模式进行了简单的介绍。每一种设计模式都有不同的场景和应用,它们可以在不同的项目中发挥作用。希望这篇文章可以帮助你了解并应用设计模式,并提升你的代码质量和开发效率。
以上就是深入了解常用的7种java设计模式的详细内容。