1 、设计模式 简单工厂设计模式

客户需要某个产品,客户直接和生成该产品的工厂打交道,工厂具体来负责产品的实现

package cn.javass.dp.simplefactory.example4;
/**
 * 某个接口(通用的、抽象的、非具体的功能的)
 */
public interface Api {
    /**
     * 某个具体的功能方法的定义,用test1来演示一下。
     * 这里的功能很简单,把传入的s打印输出即可
     * @param s 任意想要打印输出的字符串
     */
    public void test1(String s);
}
package cn.javass.dp.simplefactory.example4;
/**
 * 对某个接口的一种实现
 */
public class Impl implements Api{

    public void test1(String s) {
        System.out.println("Now In Impl. The input s=="+s);
    }
}
package cn.javass.dp.simplefactory.example4;
/**
 * 对接口的一种实现
 */
public class Impl2 implements Api{

    public void test1(String s) {
        System.out.println("Now In Impl2. The input s=="+s);
    }
}
package cn.javass.dp.simplefactory.example4;

/**
 * 工厂类,用来创造Api的
 */
public class Factory {
    /**
     * 具体的创造Api的方法,根据客户端的参数来创建接口
     * @param type 客户端传入的选择创造接口的条件
     * @return 创造好的Api对象
     */
    public static Api createApi(int type){
        //这里的type也可以不由外部传入,而是直接读取配置文件来获取
        //为了把注意力放在模式本身上,这里就不去写读取配置文件的代码了

        //根据type来进行选择,当然这里的1和2应该做成常量
        Api api = null;
        if(type==1){
            api = new Impl();
        }else if(type==2){
            api = new Impl2();
        }
        return api;
    }
}
package cn.javass.dp.simplefactory.example4;
/**
 * 客户端:测试使用Api接口
 */
public class Client {
    public static void main(String[] args) {
        //重要改变,没有new Impl()了,取而代之Factory.createApi()
        //注意这里传递的参数,修改参数就可以修改行为,试试看吧
        Api api = Factory.createApi(2);
        api.test1("哈哈,不要紧张,只是个测试而已!");
    }
}

上面这种存在一定的问题:

就是客户端在调用Api api = Factory.createApi(2);必须知道参数1 2 3的意思,可以采用下面的办法进行解决,我们通过配置文件来解决,这样客户端不需要内部的参数的意思了

我们在src目录下编写一个配置文件

FactoryTest.properties

ImplClass=cn.javass.dp.simplefactory.example5.Impl
package cn.javass.dp.simplefactory.example5;
import java.util.*;
import java.io.*;
/**
 * 工厂类,用来创造Api对象
 */
public class Factory {
    /**
     * 具体的创造Api的方法,根据配置文件的参数来创建接口
     * @return 创造好的Api对象
     */
    public static Api createApi(){
        //直接读取配置文件来获取需要创建实例的类

        //至于如何读取Properties还有如何反射这里就不解释了
        Properties p = new Properties();
        InputStream in = null;
        try {
            in = Factory.class.getResourceAsStream("FactoryTest.properties");
            p.load(in);
        } catch (IOException e) {
            System.out.println("装载工厂配置文件出错了,具体的堆栈信息如下:");
            e.printStackTrace();
        }finally{
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //用反射去创建,那些例外处理等完善的工作这里就不做了
        Api api = null;
        try {
            api = (Api)Class.forName(p.getProperty("ImplClass")).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return api;
    }
}

调用者就是不需要具体参数的意见了

package cn.javass.dp.simplefactory.example5;

/**
 * 客户端:测试使用Api接口
 */
public class Client {
    public static void main(String[] args) {
        //重要改变,没有new Impl()了,取而代之Factory.createApi()
        Api api = Factory.createApi();
        api.test1("哈哈,不要紧张,只是个测试而已!");
    }
}

简单工厂的本质是:选择而不是实现,选择的参数可以来自客户端,也可以来自配置文件,通过参数来选择不同类型的实现,实现类的功能不能放在工厂中去实现,实现类应该提前就做好

public static Api createApi(int type){
        //这里的type也可以不由外部传入,而是直接读取配置文件来获取
        //为了把注意力放在模式本身上,这里就不去写读取配置文件的代码了

        //根据type来进行选择,当然这里的1和2应该做成常量
        Api api = null;
        if(type==1){
            api = new Impl();
        }else if(type==2){
            api = new Impl2();
        }
        return api;
    }

不能把Impl的具体实现放在工厂类中是写,工厂类是依据参数来选择不同的实现类

补充三:

简单工厂的扩充

上面只提供了一个业务类

package cn.javass.dp.simplefactory.example4;
/**
 * 某个接口(通用的、抽象的、非具体的功能的)
 */
public interface Api {
    /**
     * 某个具体的功能方法的定义,用test1来演示一下。
     * 这里的功能很简单,把传入的s打印输出即可
     * @param s 任意想要打印输出的字符串
     */
    public void test1(String s);
}

如果还存在其他的业务操作,也可以采用下面的简单工厂来实现

时间: 2024-10-22 10:32:08

1 、设计模式 简单工厂设计模式的相关文章

iOS常用设计模式——简单工厂设计模式

简单工厂设计模式详解 简单工厂设计模式详解 基本概念 结构图 经典的示例 示例代码 优点 缺点 使用条件 基本概念 "专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类." 世界上就是由一个工厂类,根据传入的参数,动态地决定创建出哪一个产品类的实例. 结构图 ConcreteProduct1和ConcreteProduct2两个产品具有一个共同的父类IProject,简单工厂类为SimpleFactory,负责根据传入的不同参数来决定生产ConcreteProduct

java 设计模式--简单工厂

简单工厂设计模式,也就是静待工厂 场景,最近小米6很火啊,我也是小米的粉丝,就拿小米6来说,有黑色,白色,蓝色,三种非常亮的颜色. 先来代码,然后有疑惑,最后解释. 简单工厂设计模式有一个类是抽象类,是黑色,白色,蓝色手机的父类. /**  * 小米手机抽象类  *   * @author sdc  *  */ public abstract class XiaoMiProduction { /**  * 生产小米6的方法  */ public abstract void createXiaoM

java设计模式--简单工厂模式

 简单工厂设计模式 工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式.它定义一个用于创建对象的接口,由子类决定实例化哪一个类. 核心知识点如下: (1) 大量共同定义的接口. (2) 由不同的对象去实现该接口. (3) 子类(具体工厂类)决定实例化哪一个类(具体产品类)有着“一对一”的关系. 前言(也算是工厂的一个应用需求场景吧) 最近在构建自动化测试平台,公司需求是:必须在IE,火狐,Google浏览器下回归测试用例.Selenium的webdriv

简单工厂设计模式

说起设计模式,不得不从最简单的简单工厂设计模式开始说起. 简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常具有共同的父类.因为简单工厂模式中用于创建的方法是静态的,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,属于类创建型模式. 首先我们先看看下面这个类图: 在这个类图中,我们可以发现,静态工厂一共有三个对象是不可缺少的 1公共父类(Fruit接口) 2具体的产品类(Apple, Banana) 3静态工厂类(Simp

设计模式 -- 简单工厂(Java&&PHP)

面向对象设计的基本原则                                                                 单一职责系统中的每一个对象应该只有一个单独的职责,所有对象关注的应该是自身职责的完成.基本思想:高内聚,低耦合. 开闭原则一个对象对扩展开放,对修改关闭.基本思想:对类的改动是通过增加代码进行的,而不是修改现有的代码. 里氏替换原则在任意父类出现的地方,都可以使用子类来替代. 依赖注入原则要依赖于抽象,不要依赖于具体的实现.基本思想:在开发中尽量

一口一个设计模式--简单工厂VS工厂VS抽象工厂

前几天一直在准备大学毕业,始终脱不开身,今天终于有时间进行设计模式的研究.咱们今天研究的话题是工厂家族三种设计模式的对比--简单工厂VS工厂VS抽象工厂. 经过细心推敲,我们不难得出:工厂模式是简单工厂的升级版,抽象工厂是工厂模式的升级版,简单工厂+抽象工厂是抽象工厂的升级版.知道了它们之间的宏观关系,下面我带它们从一次次蜕变了解它们为什么是这样的关系. 我们最原始的代码思维是把所有的实现都放在一个类中,功能虽然是实现了,但耦合性非常高,很不方便维护,好比活字印刷术之前的印刷,一个地方需要修改,

设计模式-简单工厂(Demo)

简介 工厂都是创建型模式.用来NEW类的.本文章用一个故事讲述了简单工厂模式 故事 在遥远的未来.chenchen我生活条件不错.但是每天都要做饭.chenchen很懒.只想吃.不想干.所以就请了个女仆给chenchen做饭吃.女仆很牛.chenchen只要说.我要吃牛排.不一会.牛排就做好了放在桌子上.我又说还要红酒.女仆开好红酒.倒好放在桌子上.美滋滋的哈!小肉吃着.小酒喝着.美女陪着此等逍遥快活! 是什么? 代替客户端NEW类.客户端与多个类解耦 为什么要用? 上述故事.因为我做很多饭.要

设计模式- 简单工厂模式、工厂方法模式及其比较

简单工厂模式及实例 前言工大有许多同学是做java的,大家都知道java最大的优点是它的完全OO化和它在多年的发展过程中吸收和总结了许多先进的框架与模式,其中工厂模式就是最常用的模式之一.下面我想将我在学习和实践过程中对工厂模式的认识与了解介绍给大家.由于笔者能力限制,在实践中也没参与过什么大的项目,笔者参与过的项目用到的工厂模式主要是简单工厂模式(Simple Factory)和工厂方法模式(Factory Method),所以笔者在本文主要介绍的是这两种模式.准备知识在OO设计领域,我们知道

学习笔记之简单工厂设计模式

工厂设计模式:根据一定的逻辑来负责对象的生产. 简单工厂设计模式:又称为静态工厂方法模式,由一个工厂类,根据传人的参数决定生产哪一种对象 三种角色:工厂角色,抽象产品角色,具体产品角色 故事:水果农场生产水果(苹果和香蕉),一个顾客直接去农场买水果 首先抽象角色: 水果接口 public interface IFruit { void growth(); } 具体产品角色:苹果,香蕉 public class Apple implements IFruit { public void growt