java设计模式

一、工厂模式

创建一个 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 " ) ; } }


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值