单例模式工厂模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式工厂模式相关的知识,希望对你有一定的参考价值。

单例模式

单例模式的目的就是为了控制特定的类只产生一个对象。

产生单例的步骤:

1、构造方法私有化(在构造方法前面加prevate static finall)为的是不让其他类创建该类的实例化对象。

2、在类中自己创建自己的实例化对象。

3、写一个方法,返回该实例化对象。

4、在该类中还可以写其他的方法。

具体的代码如下:

public class Danli

{

    // 构造方法私有化,让其他类调用不到

    private Danli()

    {

    }

 

    // 在类中自己创建自己的实例化对象,

    private static final Danli danli = new Danli();

 

// 写一个方法,可以返回该唯一单例的实例化对象

//注意一定要加static不然其他的类中调用不到该方法,也就创建不到实例化对象

    Public static Danli getDanli()

    {

return danli;

    }

 

    // 在单例的类中写其他的方法,一般是其他类共享的数据

    public static void doSomething()

    {

System.out.println("这是单例");

    }

}

Java中使用单例的优势:

1、减少Java中因为创建实例所带来的开销。

2、便于系统跟踪单个Java实例的生命周期和实例状态。

Java单例运用的场景

1、要求生成唯一序列号的环境

2、在整个项目中需要一个共享访问点,或者共享访问数据

3、需要定义大量的静态常量和静态方法(如工具类)的环境

4、创建一个对象需要消耗的资源过多,如要访问IO(输入流)和数据库资源

工厂模式

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的过程屏蔽起来达到提高灵活性的目的。

简单工厂模式

简单工厂模式又称为静态工厂模式,它属于创建型模式。主要是根据传入的变量的不同返回不同类型的实例化对象。被创建的类通常都有共同的父类或者是实现了共同的接口。

简单工厂模式的组成:

1、工厂类(factory):由具体的Java类实现,该类根据参数的不同创建不同的实例化对象。

2、抽象产品(product):一般是有factory创建的具体的实体类的父类或者是他们共同实现的接口。

3、具体的产品(factory product):factory具体要创建的实体类。

例子:利用简单工厂模式描述果园系统;抽象出的类包括:【1抽象产品fruit】【2具体产品apple树,grapestrawBerry树】【工厂类 园丁gardener种树】

具体的代码如下:

1抽象产品fruit

/**

 * 接口里面写水果类必备的方法:种植plant();成长grow();和丰收harvest();

 */

public interface Fruit

{

    public void plant();

 

    public void grow();

 

    public void harvest();

}

2具体产品apple树,grapestrawBerry树】

public class Apple implements Fruit

{

 

    @Override

    public void plant()

    {

// TODO Auto-generated method stub

System.out.println("种苹果树");

    }

 

    @Override

    public void grow()

    {

// TODO Auto-generated method stub

System.out.println("苹果树在成长");

    }

 

    @Override

    public void harvest()

    {

// TODO Auto-generated method stub

System.out.println("收苹果");

    }

 

}

工厂类 园丁gardener种树】

/**

 * gardenner负责创建具体的实例化对象

 */

public class Gardener

{

    // 写一个方法,返回值是具体要创建的对象的父类,或者是他们共同实现的接口

    public Fruit factory(String fruitName)

    {

if ("apple".equals(fruitName))

{

    return new Apple();

}

else if ("grape".equals(fruitName))

{

    return new Grape();

}

else if ("strawberry".equals(fruitName))

{

    return new StrawBerry();

}

else

{

    System.out.println("输入的名字不正确");

    return null;

}

    }

}

测试

public class Test

{

    public static void main(String[] args)

    {

// 实例化工厂对象

Gardener gardener = new Gardener();

// 创建苹果树

Fruit apple = gardener.factory("apple");

apple.plant();

apple.grow();

apple.harvest();

// 创建葡萄树,并调用里面的在成长方法

Fruit f1 = gardener.factory("grape");

f1.grow();

// 创建葡萄树,并调用里面的在成长方法

Fruit f2 = gardener.factory("grape");

f2.grow();

// 创建树用的不是单例,所以f1 != f2

System.out.println(f1 != f2);

    }

}

简单工厂模式使用的环境:

1、工厂类负责创建的对象那个比较少

2、客户只知道传入工厂类的方法,对于如何创建对象则不关心

工厂方法模式

工厂方法模式在简单工厂模式的基础上添加了抽象工厂,这样就可以在对不同的产品使用不同的工厂。

工厂方法模式的组成

1、抽象工厂角色:工厂的实体类抽象出来的接口,或者他们共同继承的父类

2、具体工厂角色:里面写具体的业务逻辑相关的代码

3、抽象产品角色:具体的产品共同继承的父类或者实现的接口,负责定义产品的共性,实现对事物的最抽象的定义。

4、具体的产品角色:具体的工厂所创建的对象。在Java中由具体的类实现

技术分享工厂方法模式的结构图

技术分享技术分享

 

工厂方法模式使用的场景:

1、一个类不知道他需要的对象的类

2、一个类通过其子类制定创建哪个对象

对于抽象工厂类只需要提供一个创建产品的接口,而又其子类确定具体要创建的对象。在程序运行时,子类对象将覆盖父类对象,从而使系统共容易扩展。

将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以不用关心是哪一个工厂子类在创建产品子类,需要时在动态指定,可以将具体的工厂类的类名储存在配置文件中或者数据库中。

以上是关于单例模式工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

手写单例模式(饿汉和饱汉模式)和工厂模式

设计模式-单例模式工厂模式

单例模式与工厂模式

简单工厂-------And-----单例模式

工厂模式 - 单例模式

单例模式和工厂方法模式