读书笔记之设计模式-工厂模式

创建型:Factory(工厂模式)

  说到工厂,我们最新想到的应该是一堆堆的原料通过流水线组装成产品的场景吧?

  其实对于一个程序员来讲,这个模式应该是很难不遇到的,特别是对于web开发的人员。为啥呢?因为这种场景在我们使用MVC的M层中是经常会遇到的。Hibernate的SessionFactory和JPA标准的EntityFactory。

  所以说工厂模式用人类的语言来沟通的话,就是你给我清单上的原材料,我给你组装好的产品。非常简单的一个Demo(简单工厂):

package top.gabin.oa.web.design.factory;

/**
 * 食物
 * @author linjiabin on  16/4/30
 */
public interface Food {
    String getName();
}
package top.gabin.oa.web.design.factory;

/**
 * 面条
 * @author linjiabin on  16/4/30
 */
public class Noodles implements Food {
    @Override
    public String getName() {
        return "面条";
    }
}
package top.gabin.oa.web.design.factory;

/**
 * 米饭
 * @author linjiabin on  16/4/30
 */
public class Rice implements Food {
    @Override
    public String getName() {
        return "米饭";
    }
}
package top.gabin.oa.web.design.factory;

/**
 * 食物简单工厂类
 * @author linjiabin on  16/4/30
 */
public class SimpleFactory {

    public static Food createFood(String foodName) {
        if (foodName != null) {
            if (foodName.equals("Noodles")) {
                return new Noodles();
            } else if (foodName.equals("Rice")) {
                return new Rice();
            }
        }
        return null;
    }

}
package top.gabin.oa.web.design.factory;

import org.junit.Test;

/**
 * 简单工厂测试类
 * @author linjiabin on  16/4/30
 */
public class TestSimpleFactory {

    @Test
    public void testSimple() {
        Food noodles = SimpleFactory.createFood("Noodles");
        if (noodles != null) {
            System.out.println(noodles.getName());
        }
    }
}

输出:

面条

  上面是一个很简单的工厂应用,一般我们不认为简单工厂是设计模式。我们认为的工厂模式一般指的是抽象工厂。

  现在我们假设我是一家上市公司总公司的总裁,我们公司的主要业务是手机,而我们公司在全世界各地都有分工厂。

  ok,现在首先我们希望有一个标准的抽象工厂类

package top.gabin.oa.web.design.factory.normal;

import java.util.ArrayList;
import java.util.List;

/**
 * 手机工厂
 * @author linjiabin on  16/4/30
 */
public abstract class PhoneFactory {
    // 元件
    private List<Component> componentList = new ArrayList<>();

    // 获取组件
    protected final List<Component> getComponentList() {
        componentList.add(new Screen());
        componentList.add(new Camera());
        return componentList;
    }

    // 订购手机
    protected final Phone orderPhone() {
        Phone phone = createPhone();
        return phone;
    }

    // 生产手机
    public abstract Phone createPhone();

}

很明显,我们不希望我们的子公司自己去采购元件和出售手机,所以获取元件的方式和出售手机的方式还是由抽象父类来决定。而生产手机的具体流程由子类来实现。这就是将实例化对象的行为交给子类去决定,我也只给你这个权利,其他的你得听我的。

就像我们在厦门设置了一个分工厂:

package top.gabin.oa.web.design.factory.normal;

import java.util.List;

/**
 *
 * @author linjiabin on  16/4/30
 */
public class XmPhoneFactory extends PhoneFactory {

    @Override
    public Phone createPhone() {
        Phone phone = new Phone() {
        };
        // 获取所有元件,
        List<Component> componentList = getComponentList();
        for (Component component : componentList) {
            // 组装
            component.assembly(phone);
        }
        return phone;
    }

}

demo中涉及的其他类:

package top.gabin.oa.web.design.factory.normal;

/**
 * 手机
 * @author linjiabin on  16/4/30
 */
public class Phone {
    private Screen screen;
    private Camera camera;

    public Screen getScreen() {
        return screen;
    }

    public void setScreen(Screen screen) {
        this.screen = screen;
    }

    public Camera getCamera() {
        return camera;
    }

    public void setCamera(Camera camera) {
        this.camera = camera;
    }
}
package top.gabin.oa.web.design.factory.normal;

/**
 * 元件
 * @author linjiabin on  16/4/30
 */
public interface Component {
    /**
     * 组装方法
     * @param phone
     */
    void assembly(Phone phone);
}
package top.gabin.oa.web.design.factory.normal;

/**
 * 屏幕
 * @author linjiabin on  16/4/30
 */
public class Screen implements Component {
    @Override
    public void assembly(Phone phone) {
        phone.setScreen(this);
    }
}

  

时间: 2024-12-30 22:20:05

读书笔记之设计模式-工厂模式的相关文章

5分钟读书笔记之 - 设计模式 - 工厂模式

一个类或者对象中,往往会包含别的对象.在创建这种对象的时候,你可能习惯于使用常规方式,即用 new 关键字和类构造函数. 这会导致相关的俩个类之间产生依赖. 工厂模式,就是消除这俩个类之间的依赖性的一种模式,它使用一种方法来决定究竟实例化那个具体的类. 简单工厂模式 假设你想开几个自行车商店,每个商店都有几种型号的自行车出售,可以用这样一个类来表示: var BicycleShop = function(){} BicycleShop.prototype = { sellBicycle:func

大话设计模式读书笔记1——简单工厂模式

最近几日,重温了一下<大话设计模式>这本书,当时读的仓促,有很多没有注意的地方,现在仔细翻看起来,发现这值得细细品味的一本书!! 好东西就要记下来!!! 第一章笔记:从一个简单的计算器程序来看简单工厂模式. 变化的地方就要封装,用一个单独的类来做创造实例的过程这就是工厂. UML图: /// <summary> /// 运算类 /// </summary> public class Operation { public double Number1 { get; set

5分钟读书笔记之 - 设计模式 - 桥接模式

补充一点知识: 私有变量 在对象内部使用'var'关键字来声明,而且它只能被私有函数和特权方法访问.私有函数 在对象的构造函数里声明(或者是通过var functionName=function(){...}来定义),它能被特权函数调用(包括对象的构造函数)和私有函数调用.特权方法 通过this.methodName=function(){...}来声明而且可能被对象外部的代码调用.可以使用:this.特权函数() 方式来调用特权函数,使用 :私有函数()方式来调用私有函数.公共属性 通过thi

5分钟读书笔记之 - 设计模式 - 门面模式

门面模式有俩个作用: 简化类的接口 消除类与使用它的客户代码之间的耦合 在javascript中,门面模式常常是开发人员最亲密的朋友.它是几乎所有javascript库的核心原则,门面模式可以使库提供的工具更容易理解.使用这种模式,程序员可以间接地与一个子系统打交道,与直接访问子系统相比,这样做更不容易出错. addEvent函数是一个基本的门面,你不用在每次为一个元素添加事件监听器的时候都得针对浏览器间的差异进行检查,有了这个便利,你可以把这个添加事件的底层细节抛在脑后,而把心思集中在如何构建

5分钟读书笔记之 - 设计模式 - 单体模式

单体是一个用来划分命名空间,并将一批相关方法和属性组织在一起的对象,如果它可以被实例化,那么它只能被实例化一次. 单体模式,就是将代码组织为一个逻辑单元,这个逻辑单元中的代码可以通过单一的变量进行访问. 单体基本结构是这样: var Singleton = { attribute1:true, attribute2:10, method1:function(){}, method2:function(){} } 借助闭包实现单体: Namespace.Singleton = {} 定义之后立即执

5分钟读书笔记之 - 设计模式 - 组合模式

组合模式是一种专为创建Web上的动态用户界面而量身定制的模式,使用这种模式,可以用一条命令在对各对象上激发复杂的或递归的行为. 在组合对象的层次体系中有俩种类型对象:叶对象和组合对象.这是一个递归定义,但这正是组合模式如此有用的原因所在.一个组合对象由一些别的组合对象和叶对象组成,其中只有叶对象不再包含子对象,叶对象是组合对象中最基本的元素,也是各种操作的落实地点. 存在一批组织成某种层次体系的对象(具体的结构在开发期间可能无法得知) 希望这批对象或其中的一部分对象实施一个操作 表单验证实例:

设计模式那点事读书笔记(2)----抽象工厂模式

抽象工厂模式: 此模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类. 解决什么问题: 抽象工厂模式允许客户在使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品.从而实现客户从具体的产品中解耦. UML: 代码结构: 代码: 定义抽象产品: package com.demo.factory.model; /** * 抽象产品 */ public abstract class AbstractBa

大话设计模式读书笔记--1.简单工厂模式

定义 专门定义一个类来负责创建其他类的实例, 被创建的类通常具有共同的父类. 它又称为静态工厂模式,属于类的创建型模式 模式类图 将对象的创建和对象本身业务处理分离了,可以降低系统的耦合 工厂模式实现 场景:实现一个计算器, 输入a和b, 计算a+b和a-b 下载代码,解压后目录如下图: 优缺点 当增加一个乘法运算时,需要添加乘法类和修改工厂类创建对象的逻辑,它违反了开闭原则 优点:提供专门的工程类创建对象, 降低系统的耦合 缺点: 添加新产品时,需要修改工厂类, 系统扩展困难 使用场景 1.客

读书笔记之设计模式-命令模式

行为型:Command(命令模式) 命令模式: 目的:其实一般设计模式就是为了解耦.也没什么特别的,命令模式实际上就是将命令的请求者和命令的执行者解耦. 白话:领导说了,让把这个月的项目计划压缩到三个礼拜完成,还说了:"不管你用什么办法".这句“不管你用什么办法”就是我们所说的解耦.我不需要关心你怎么去做,我只要你能实现我想达到的目的. 模式结构:一般包含下面几个部分. Client:客户 Invoker:命令触发者 Command:命令 ConcreteCommand:具体命令实现