zoukankan      html  css  js  c++  java
  • 单例模式工厂模式

    单例模式

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

    产生单例的步骤:

    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、一个类通过其子类制定创建哪个对象

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

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

  • 相关阅读:
    在Lufylegend中如何设置bitmap或者sprite的缩放和旋转中心
    面试必备:文本框与按钮的最简组合
    JavaScript设计模式之策略模式(学习笔记)
    JavaScript设计模式之观察者模式(学习笔记)
    Canvas transform浅析
    JavaScript ArrayBuffer浅析
    IE8-下背景色半透明滤镜在jquery动画中失效问题记录
    JQuery__Tab实践
    memoization提升递归效率
    es6--箭头函数
  • 原文地址:https://www.cnblogs.com/weyine/p/7257165.html
Copyright © 2011-2022 走看看