一、工厂模式

创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。

1、创建一个接口:



Shape.java

public interface Shape { void draw();}


2、创建实现接口的实体类。



Rectangle.java

public class Rectangle implements Shape { @Override public void draw() { System
.out.println("Inside Rectangle::draw() method."); }}




Square.java
public class Square implements Shape { @Override public void draw() { System.
out.println("Inside Square::draw() method.");}}



Circle.java
public class Circle implements Shape { @Override public void draw() { System.
out.println("Inside Circle::draw() method."); }}

2、创建一个工厂,生成基于给定信息的实体类的对象。



ShapeFactory.java

public class ShapeFactory { //使用 getShape 方法获取形状类型的对象 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(); } else if(shapeType.
equalsIgnoreCase("SQUARE")){ return new Square(); } return null; }}


4、使用该工厂,通过传递类型信息来获取实体类的对象。



FactoryPatternDemo.java

public class FactoryPatternDemo { public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory(); //获取 Circle 的对象,并调用它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE"); //调用 Circle 的 draw 方法 shape1.
draw(); //获取 Rectangle 的对象,并调用它的 draw 方法 Shape shape2 = shapeFactory.getShape("
RECTANGLE"); //调用 Rectangle 的 draw 方法 shape2.draw(); //获取 Square 的对象,并调用它的 draw
方法 Shape shape3 = shapeFactory.getShape("SQUARE"); //调用 Square 的 draw 方法 shape3.
draw(); }}


二、单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。

注意:

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。



创建一个 SingleObject 类。SingleObject 类有它的私有构造函数和本身的一个静态实例。

SingleObject 类提供了一个静态方法,供外界获取它的静态实例。SingletonPatternDemo,我们的演示类使用 SingleObject
 类来获取 SingleObject对象。
1、创建一个 Singleton 类
public class SingleObject { //创建 SingleObject 的一个对象 private static SingleObject
instance = new SingleObject(); //让构造函数为 private,这样该类就不会被实例化 private SingleObject
(){} //获取唯一可用的对象 public static SingleObject getInstance(){ return instance; }
public void showMessage(){ System.out.println("Hello World!"); }}

2、从 singleton 类获取唯一的对象

public class SingletonPatternDemo { public static void main(String[] args) { //
不合法的构造函数 //编译时错误:构造函数 SingleObject() 是不可见的 //SingleObject object = new
SingleObject(); //获取唯一可用的对象 SingleObject object = SingleObject.getInstance(); //
显示消息 object.showMessage(); }}

三、适配器模式



1、为媒体播放器和更高级的媒体播放器创建接口。

MediaPlayer.java
public interface MediaPlayer { public void play(String audioType, String
fileName);}
AdvancedMediaPlayer.java
public interface AdvancedMediaPlayer { public void playVlc(String fileName);
public void playMp4(String fileName);}
2、创建实现了 AdvancedMediaPlayer 接口的实体类。

VlcPlayer.java
public class VlcPlayer implements AdvancedMediaPlayer{ @Override public void
playVlc(String fileName) { System.out.println("Playing vlc file. Name: "+
fileName); } @Override public void playMp4(String fileName) { //什么也不做 }}
Mp4Player.java
public class Mp4Player implements AdvancedMediaPlayer{ @Override public void
playVlc(String fileName) { //什么也不做 } @Override public void playMp4(String
fileName) { System.out.println("Playing mp4 file. Name: "+ fileName); }}
3、创建实现了 MediaPlayer 接口的适配器类。

MediaAdapter.java
public class MediaAdapter implements MediaPlayer { AdvancedMediaPlayer
advancedMusicPlayer; public MediaAdapter(String audioType){ if(audioType.
equalsIgnoreCase("vlc") ){ advancedMusicPlayer = new VlcPlayer(); } else if (
audioType.equalsIgnoreCase("mp4")){ advancedMusicPlayer = new Mp4Player(); } } @
Override public void play(String audioType, String fileName) { if(audioType.
equalsIgnoreCase("vlc")){ advancedMusicPlayer.playVlc(fileName); }else if(
audioType.equalsIgnoreCase("mp4")){ advancedMusicPlayer.playMp4(fileName); } }}
4、创建实现了 MediaPlayer 接口的实体类。

AudioPlayer.java
public class AudioPlayer implements MediaPlayer { MediaAdapter mediaAdapter; @
Override public void play(String audioType, String fileName) { //播放 mp3
音乐文件的内置支持 if(audioType.equalsIgnoreCase("mp3")){ System.out.println("Playing
mp3 file. Name:"+ fileName); } //mediaAdapter 提供了播放其他文件格式的支持 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"); } }
}
5、使用 AudioPlayer 来播放不同类型的音频格式。

AdapterPatternDemo.java
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"); }}







友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信