单例模式
单例模式的目的就是为了控制特定的类只产生一个对象。
产生单例的步骤:
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树,grape树strawBerry树】【工厂类 园丁gardener种树】
具体的代码如下:
【1、抽象产品fruit】
/**
* 接口里面写水果类必备的方法:种植plant();成长grow();和丰收harvest();
*/
public interface Fruit
{
public void plant();
public void grow();
public void harvest();
}
【2、具体产品apple树,grape树strawBerry树】
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、一个类通过其子类制定创建哪个对象
对于抽象工厂类只需要提供一个创建产品的接口,而又其子类确定具体要创建的对象。在程序运行时,子类对象将覆盖父类对象,从而使系统共容易扩展。
将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以不用关心是哪一个工厂子类在创建产品子类,需要时在动态指定,可以将具体的工厂类的类名储存在配置文件中或者数据库中。