欢迎光临散文网 会员登陆 & 注册

java23种设计模式

2023-06-18 03:10 作者:自由的莱纳  | 我要投稿

在Java编程中,有23种常见的设计模式,它们被分为三个不同的分类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式(Behavioral Patterns)。以下是对每种设计模式的简要介绍以及示例代码: 1. 创建型模式(Creational Patterns):   a. 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供全局访问点。 ```java public class Singleton {   private static Singleton instance;   private Singleton() {     // 私有构造函数   }   public static Singleton getInstance() {     if (instance == null) {       instance = new Singleton();     }     return instance;   } } ```   b. 工厂模式(Factory Pattern):通过使用工厂方法创建对象,而不直接实例化对象。 ```java public interface Shape {   void draw(); } public class Rectangle implements Shape {   @Override   public void draw() {     System.out.println("Drawing a rectangle.");   } } public class Circle implements Shape {   @Override   public void draw() {     System.out.println("Drawing a circle.");   } } public class ShapeFactory {   public Shape createShape(String shapeType) {     if (shapeType.equalsIgnoreCase("rectangle")) {       return new Rectangle();     } else if (shapeType.equalsIgnoreCase("circle")) {       return new Circle();     }     return null;   } } // 使用示例 ShapeFactory factory = new ShapeFactory(); Shape rectangle = factory.createShape("rectangle"); rectangle.draw(); Shape circle = factory.createShape("circle"); circle.draw(); ```   c. 抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建相关或依赖对象的家族,而无需指定具体类。 ```java public interface Shape {   void draw(); } public class Rectangle implements Shape {   @Override   public void draw() {     System.out.println("Drawing a rectangle.");   } } public class Circle implements Shape {   @Override   public void draw() {     System.out.println("Drawing a circle.");   } } public interface Color {   void fill(); } public class Red implements Color {   @Override   public void fill() {     System.out.println("Filling with red color.");   } } public class Blue implements Color {   @Override   public void fill() {     System.out.println("Filling with blue color.");   } } public interface AbstractFactory {   Shape createShape();   Color createColor(); } public class ShapeFactory implements AbstractFactory {   @Override   public Shape createShape() {     return new Rectangle();   }   @Override   public Color createColor() {     return new Red();   } } public class ColorFactory implements AbstractFactory {   @Override   public Shape createShape() {     return new Circle();   }   @Override   public Color createColor() {     return new Blue();   } } // 使用示例 AbstractFactory shapeFactory = new ShapeFactory(); Shape shape = shapeFactory.createShape(); shape.draw(); Color color = shapeFactory.createColor(); color.fill(); AbstractFactory colorFactory = new ColorFactory(); Shape shape = colorFactory.createShape(); shape.draw(); Color color = colorFactory.createColor(); color.fill(); ```   d. 建造者模式(Builder Pattern):将一个复杂对象的构建与其表示分别,以便同样的构建过程可以创建不同的表示。 ```java public class Car {   private String brand;   private String model;   private int year;   private Car(Builder builder) {     this.brand = builder.brand;     this.model = builder.model;     this.year = builder.year;   }   public String getBrand() {     return brand;   }   public String getModel() {     return model;   }   public int getYear() {     return year;   }   public static class Builder {     private String brand;     private String model;     private int year;     public Builder setBrand(String brand) {       this.brand = brand;       return this;     }     public Builder setModel(String model) {       this.model = model;       return this;     }     public Builder setYear(int year) {       this.year = year;       return this;     }     public Car build() {       return new Car(this);     }   } } // 使用示例 Car car = new Car.Builder()     .setBrand("Toyota")     .setModel("Camry")     .setYear(2022)     .build(); System.out.println("Brand: " + car.getBrand()); System.out.println("Model: " + car.getModel()); System.out.println("Year: " + car.getYear()); ``` 2. 结构型模式(Structural Patterns):   a. 适配器模式(Adapter Pattern):将一个类的接口转换成客户端期望的另一个接口。 ```java 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 {   @Override   public void playVlc(String fileName) {     System.out.println("Playing vlc file: " + fileName);   }   @Override   public void playMp4(String fileName) {     // 空实现   } } public class Mp4Player implements AdvancedMediaPlayer {   @Override   public void playVlc(String fileName) {     // 空实现   }   @Override   public void playMp4(String fileName) {     System.out.println("Playing mp4 file: " + fileName);   } } public class MediaAdapter implements MediaPlayer {   private AdvancedMediaPlayer advancedMediaPlayer;   public MediaAdapter(String audioType) {     if (audioType.equalsIgnoreCase("vlc")) {       advancedMediaPlayer = new VlcPlayer();     } else if (audioType.equalsIgnoreCase("mp4")) {       advancedMediaPlayer = new Mp4Player();     }   }   @Override   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 {   private MediaAdapter mediaAdapter;   @Override   public void play(String audioType, String fileName) {     if (audioType.equalsIgnoreCase("mp3")) {       System.out.println("Playing mp3 file: " + fileName);     } else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {       mediaAdapter = new MediaAdapter(audioType);       mediaAdapter.play(audioType, fileName);     } else {       System.out.println("Invalid media type: " + audioType);     }   } } // 使用示例 MediaPlayer audioPlayer = new AudioPlayer(); audioPlayer.play("mp3", "song.mp3"); audioPlayer.play("vlc", "movie.vlc"); audioPlayer.play("mp4", "video.mp4"); audioPlayer.play("avi", "movie.avi"); ``` b. 桥接模式(Bridge Pattern):将抽象部分与其具体实现部分分离,使它们可以独立变化。 ```java public interface Color {   void applyColor(); } public class Red implements Color {   @Override   public void applyColor() {     System.out.println("Applying red color.");   } } public class Blue implements Color {   @Override   public void applyColor() {     System.out.println("Applying blue color.");   } } public abstract class Shape {   protected Color color;   public Shape(Color color) {     this.color = color;   }   abstract void applyColor(); } public class Square extends Shape {   public Square(Color color) {     super(color);   }   @Override   void applyColor() {     System.out.print("Square ");     color.applyColor();   } } public class Circle extends Shape {   public Circle(Color color) {     super(color);   }   @Override   void applyColor() {     System.out.print("Circle ");     color.applyColor();   } } // 使用示例 Color redColor = new Red(); Shape square = new Square(redColor); square.applyColor(); Color blueColor = new Blue(); Shape circle = new Circle(blueColor); circle.applyColor(); ``` 3. 行为型模式(Behavioral Patterns):   a. 观察者模式(Observer Pattern):定义对象之间的一对多依赖关系,当一个对象状态改变时,其所有依赖者都会收到通知并自动更新。 ```java import java.util.ArrayList; import java.util.List; public interface Observer {   void update(String message); } public class User implements Observer {   private String name;   public User(String name) {     this.name = name;   }   @Override   public void update(String message) {     System.out.println(name + " received a new message: " + message);   } } public interface Subject {   void attach(Observer observer);   void detach(Observer observer);   void notifyObservers(String message); } public class ChatRoom implements Subject {   private List observers = new ArrayList<>();   @Override   public void attach(Observer observer) {     observers.add(observer);   }   @Override   public void detach(Observer observer) {     observers.remove(observer);   }   @Override   public void notifyObservers(String message) {     for (Observer observer : observers) {       observer.update(message);     }   }   public void sendMessage(String message) {     notifyObservers(message);   } } // 使用示例 ChatRoom chatRoom = new ChatRoom(); Observer user1 = new User("User 1"); Observer user2 = new User("User 2"); Observer user3 = new User("User 3"); chatRoom.attach(user1); chatRoom.attach(user2); chatRoom.attach(user3); chatRoom.sendMessage("Hello, everyone!"); chatRoom.detach(user2); chatRoom.sendMessage("User 2 has left the chat."); ``` b. 策略模式(Strategy Pattern):定义一系列算法,将每个算法封装起来,使它们可以相互替换,使算法的变化独立于使用它的客户端。 ```java public interface PaymentStrategy {   void pay(double amount); } public class CreditCardStrategy implements PaymentStrategy {   private String cardNumber;   private String expirationDate;   private String cvv;   public CreditCardStrategy(String cardNumber, String expirationDate, String cvv) {     this.cardNumber = cardNumber;     this.expirationDate = expirationDate;     this.cvv = cvv;   }   @Override   public void pay(double amount) {     System.out.println("Paying " + amount + " using credit card.");     // 执行信用卡支付逻辑   } } public class PayPalStrategy implements PaymentStrategy {   private String email;   private String password;   public PayPalStrategy(String email, String password) {     this.email = email;     this.password = password;   }   @Override   public void pay(double amount) {     System.out.println("Paying " + amount + " using PayPal.");     // 执行PayPal支付逻辑   } } public class ShoppingCart {   private List items;   public ShoppingCart() {     this.items = new ArrayList<>();   }   public void addItem(Item item) {     items.add(item);   }   public void removeItem(Item item) {     items.remove(item);   }   public double calculateTotal() {     double total = 0.0;     for (Item item : items) {       total += item.getPrice();     }     return total;   }   public void pay(PaymentStrategy paymentStrategy) {     double amount = calculateTotal();     paymentStrategy.pay(amount);   } } public class Item {   private String name;   private double price;   public Item(String name, double price) {     this.name = name;     this.price = price;   }   public String getName() {     return name;   }   public double getPrice() {     return price;   } } // 使用示例 ShoppingCart cart = new ShoppingCart(); Item item1 = new Item("Item 1", 10.0); Item item2 = new Item("Item 2", 20.0); cart.addItem(item1); cart.addItem(item2); PaymentStrategy creditCardStrategy = new CreditCardStrategy("123456789", "12/25", "123"); cart.pay(creditCardStrategy); PaymentStrategy payPalStrategy = new PayPalStrategy("example@example.com", "password"); cart.pay(payPalStrategy); ``` 这里仅提供了每种设计模式的简要介绍以及示例代码。设计模式是一种用于解决特定问题的经典解决方案,根据实际需求选择合适的设计模式进行应用。在实际开发中,设计模式的选择应该基于具体的情况和需求,并根据项目的规模和复杂度进行适当的调整。

java23种设计模式的评论 (共 条)

分享到微博请遵守国家法律