设计模式—简单工厂

工厂模式:使用者不用创建使用对象,直接从工厂取出对象进行使用。

示例:子宫(工厂)创造各种动物

  工厂模式的优势:在添加动物的时候不需要修改客户端(TestFactoryPattern),只需要直接添加动物就可以,工厂会自动(这时需要一个标示告诉工厂你需要那种动物,也就是type)返回需要的动物。

工厂模式类图:

直接代码:

定义一个抽象类Animal,定义动物的共同属性 name,speed,共同行为:say(),run();,子类可进行覆写方法实现自己特有的行为。

package com.zpj.designMode;
/**
 * @author PerKins Zhu
 * @date:2016年8月27日 下午5:11:07
 * @version :1.1
 *
 */
public abstract class Animal {
    public String name;
    public int speed;
    public abstract void run();
    public abstract void say();
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }
}

下面添加三个动物:Person  Tiger ,Panda

package com.zpj.designMode;

/**
 * @author PerKins Zhu
 * @date:2016年8月27日 下午5:13:48
 * @version :1.1
 *
 */
public class Person extends Animal {

    public Person() {
    }

    public Person(String name, int speed) {
        this.name = name;
        this.speed = speed;
    }

    @Override
    public void run() {
        System.out.println(name + "--两条腿跑---speed:" + speed + "KM/h");
    }

    @Override
    public void say() {
        System.out.println(name + "--嘴说--- hello , i am " + name);
    }
}
package com.zpj.designMode;

/**
 * @author PerKins Zhu
 * @date:2016年8月27日 下午5:18:45
 * @version :1.1
 *
 */
public class Tiger extends Animal {

    public Tiger() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Tiger(String name, int speed) {
        super();
        this.name = name;
        this.speed = speed;
    }

    public void run() {
        System.out.println(name + "--四条腿窜---speed:" + speed);
    }

    public void say() {
        System.out.println(name + "--吼--- hello , i am " + name);
    }

}
package com.zpj.designMode;
/**
 * @author PerKins Zhu
 * @date:2016年8月27日 下午5:17:45
 * @version :1.1
 *
 */
public class Panda extends Animal{

    public Panda() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Panda(String name,int speed) {
        this.name = name;
        this.speed = speed;
    }

    public void run() {
        System.out.println(name + "--四条腿爬---speed:" + speed);
    }

    public void say() {
        System.out.println(name + "--不知道--- hello , i am " + name);
    }

}

创建个子宫(工厂)生产动物

package com.zpj.designMode;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.Properties;

/**
 * @author PerKins Zhu
 * @date:2016年8月27日 下午5:21:38
 * @version :1.1
 *
 */
public class Uterus {

    public static Animal createAnimal(int type) {//type 类型告诉工厂客户端需要什么动物
        switch (type) {
        case 1:
            return new Person("所谓的高级动物", 30);
        case 2:
            return new Tiger("老虎", 100);
        case 3:
            return new Panda("黑白猫", 10);
        }
        return null;
    }

    public static Animal createAnimal() throws Exception {
        //从配置文件中读出客户端需要什么动物
        Properties prop = new Properties();
        InputStream in = Object.class.getResourceAsStream("/com/zpj/designMode/animal.properties");
        try {
            prop.load(in);
            String type = prop.getProperty("type").trim();
            String name = prop.getProperty("name").trim();
            String speed = prop.getProperty("speed").trim();
            //使用反射机制生成客户端需要的动物
            Class classs = Class.forName(type);
            Animal animal = (Animal) classs.newInstance();
            animal.setName(name);
            animal.setSpeed(Integer.parseInt(speed));
            return animal;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

测试类:

package com.zpj.designMode;

import org.junit.Test;

/**
 * @author PerKins Zhu
 * @date:2016年8月27日 下午5:39:35
 * @version :1.1
 *
 */
public class TestFactoryPattern {

    @Test
    public void test01() throws Exception {
        Animal animal;
        for (int i = 1; i < 4; i++) {
            System.out.println("-----------------test:" + i + " -------------------");
            animal = Uterus.createAnimal(i);
            animal.say();
            animal.run();
        }
    }

    //使用配置文件告诉工厂需要什么动物
    @Test
    public void test02() throws Exception {
        Animal animal;
        animal = Uterus.createAnimal();
        animal.say();
        animal.run();
    }
}

说明一下:

test01()是普通的工厂模式,这里有一个缺陷,就是在增加动物的时候需要更改工厂,在 public static Animal createAnimal(int type)方法中需要添加一种新类型。test02()是优化后的测试方法,此时调用public static Animal createAnimal() throws Exception (),从配置文件中读取客户端需要的对象,此时如果需要添加动物,只需要修改配置问价就可以了,不需要再对
createAnimal()方法进行修改。

配置文件内容:

    type=com.zpj.designMode.Person
    name=所谓的高级动物
    speed=30

注意:

  注意读取配置文件的路径问题

  反射机制使用的时候类中必须有空的构造方法。

时间: 2024-11-05 11:27:06

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

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

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

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

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

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

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

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

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

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

简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.下面是简单工厂UML模型: 那么简单工厂模式是在什么场景下使用呢,下面就以本人的理解举例说明: 就拿登录功能来说,假如应用系统需要支持多种登录方式如:手机认证.邮箱认证.用户名登录.那么自然的做法就是建立一个各种登录方式都适用的接口. 定义登录接口: package com.simple.factory; /** * 登录接口 * */ pu

Java研究之学习设计模式-简单工厂模式详解

 简介: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 类图: 从UML类图中,可以看出,简单工厂模式的意思,就是把一个类内部,需要生成的部分,提取出来,变为一个工厂,通过工厂来new对象. 假设我们要吃苹果了,我们可以在代码中new一个苹果出来:当我们需要吃香蕉了,我们在代码中new一个香蕉出来.这种做法你会不会觉得麻烦

跟着ZHONGHuan学习设计模式--简单工厂

转载请注明出处!!!http://blog.csdn.net/zhonghuan1992 所有配套代码均在github上:https://github.com/ZHONGHuanGit/DesignPattern 跟着ZHONGHuan学习设计模式 简单工厂 简介: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.   类图: 从

1.大话设计模式-简单工厂模式

编程时一门技术,更是一门艺术 简单工厂模式利用面向对象方式通过继承.封装.多态把程序的耦合度降低,设计模式使得程序更加灵活,容易修改,易于复用. 下面是服务器计算器代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignModel 8 { 9 /// <s

PHP经典设计模式--简单工厂模式

PHP经典设计模式--简单工厂模式 pfinal介绍 本来我们要获取一个类的实例,需要用到new关键字.但是如果new 直接写到业务代码里,一个类在很多地方都实例化过,以后要是这个类出了什么问题,比如要改个名字(实际中,你更多的可能是修改构造函数方法),那么就尴尬了,需要改很多地方. 工厂模式,顾名思义,就是不用new来获得实例,而是把业务类放进一个工场类里,由工厂(类)『生产』出对应的实例. 实现 SimpleFactory.php <?php namespace DesignPatterns

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

简单工厂模式(Factory Pattern)是一种创建型的设计模式,像工厂一样根据要求生产对象实例. 特点:根据不同的条件,工厂实例化出合适的对象. <大话设计模式>中实例:四则运算计算器 代码: 1 #!/usr/bin/env python 2 #-*- coding: utf-8 -*- 3 4 class Operation: 5 def getResult(self): 6 pass 7 8 class OperationAdd(Operation): 9 def getResul