对工厂模式与单例模式的理解

来源:互联网 发布:不喝牛奶 知乎 编辑:程序博客网 时间:2024/04/30 15:27

正式学java也那么久了,今天就来梳理一下java的工厂模式(据说这是java23例模式中最简单的一种模式)

所谓的工厂模式大概就是通过一个接口实现对子类的调用,当初我接触工厂模式的时候,还没意识到原来这就是工厂模式,

当时老师是据了一个抽奖系统的例子,大概是这样,先写一个接口,再写好N个奖品类,譬如说Car类,让这些类继承这个接口,实现接口里的方法,在写一个类,这个类能够处理传过来的奖品类,那么问题就是一个类怎么实现通过一个构造函数接受这么多的奖品类呢?显然,通过对奖品的向上转型,用最开始写好的接口接收写好的奖品类,再用这个接口直接调用奖品类实现的接口里的方法,这样就达到了降低耦合的效果,每当我们需要加类的时候,我们不需要重构整个系统的代码, 只需要增加类就好了,然后在关键位置上加上实现的代码。我当时接触的例子大概就是这样。

那么,真正的工厂类是什么样子的呢?

接下来,我以一个学面向对象入门时的例子Shape类来写一下,这个工厂模式。

//由于没有使用CSDN 提供的MarkDown编辑器,这里代码可能有点难看,暂时将就一下

先建一个接口Shape,并保存为Shap.java

public interface Shape{

public void showShape();

}

在写几个形状类Rectangle Square Circle 等,以下就以Circle为例

public class Circle implements Shape{

public void showShape(){

System.out.println("My shape : Circle");

}

}

最后就是这个工厂类了

public class ShapeFactory{

String  shape;

public ShapeFactory(String shape){

this.shape=shape;

}

public Shape getShape(){

if(this.shape.equals("rectangle")){

return new Circle();

}else if(this.shape.equals("square")){

return new Square();

}else if(this.shape.equals("circle")){

return new Circle();

}else{

return null;

}

}

}

最后就是客户端的实现代码:

以下保存为Main.java

public class Main{

public static void main(String [] args){

Shape circle = new Shape("circle").getShape();

Shape square = new Shape("square").getShape();

Shape rectangle =  new shape("rectangle").getShape();

//通过上述代码就能够实现通过工厂模式实现对象的实例化

//这就是比较规范的工厂模式

}

}

下面我再来写写单例模式,

我们知道有些类是不能被实例化的,比如说Math类,要使用它的话,直接 用 Math.  来访问它的方法就 ok了

那么单例模式也与此有异曲同工之妙,

写一个单例模式的SingTestItem类

public class SingTestItem{

public static SingTestItem single=new SingTestItem() ;//实例化一个静态的本类对象,注意,是静态的实例

private SingTestItem(){}//关键是这一步,把构造方法设置权限为私有,这样外部就不能通过构造方法来实例化对象了

public static SingTestItem getInstace(){//通过调用这个方法就能够放回一个对象,这个方法也应该是静态的,才能实现全局只有一个实例

return single;

}


单例的意义在于:目前只能浅显地理解,

比如说,一个国家只能有一个主席或者说总统









0 0
原创粉丝点击