浅析设计模式(四)——创建型模式之simple-factory(简单工厂方法,非设计模式)

简单工厂方法simple-factory

注:部分内容参考自《Head First设计模式》和GoF《设计模式:可复用面向对象软件的基础》

  首先需要说明的是:简单工厂方法不是一种设计模式,它更像是一种编程习惯。

  定义:简单工厂方法把变化的部分(即创建对象的细节)封装起来,即通过工厂类(Factory)来处理创建对象的细节。

  这种处理方式把创建对象的细节进行了简单的封装,单独进行管理,使之解耦,便于维护。

例如:要创建不同类型的Pizza,我们不在PizzaStore的方法中直接根据Pizza类型来创建Pizza,而是把这些创建的代码通过工厂(factory)封装起来,由factory直接负责和维护。这样PizzaStore与Pizza的创建变分离开了,后续如果有新增加的Pizza只要维护factory即可。

1、PizzaStore类

  其中的pizza = factory.createPizza(type);便是由工厂类进行实际的处理。

  试想下,如果把创建Pizza对象的代码直接写在PizzaStore中,后续每次新增或者修改一类Pizza,都需要对PizzaStore进行修改以适应最新的场景。实际上PizzaStore的其他流程并没有发生化,需要变化的只是Pizza的种类罢了。如果以现在的方式来维护的话,处理Pizza的工作全部由工厂类来处理,PizzaStore完全不用关心实际的处理,只需要按照正常的流程即可。

package com.designpatterns.creationalpatterns.simplefactory;

/**
 *
 * Reference : Head-First-Design-Patterns
 *
 */
public class PizzaStore {
    /**
     * 工厂类,负责处理创建对象的具体细节
     */
    SimplePizzaFactory factory;

    public PizzaStore(SimplePizzaFactory factory) {
        this.factory = factory;
    }
    public void setFactory(SimplePizzaFactory factory) {
        this.factory = factory;
    }

    public Pizza orderPizza(String type) {
        Pizza pizza;

        /**
         * <p>
         * 这里原本是工厂方法中创建Pizza的过程,被factory进行了封装
         * <p>
         * Here we create the pizza with factory.
         */
        pizza = factory.createPizza(type);

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }
}

2、工厂类Factory

  封装实际的创建对象工作。

 1 package com.designpatterns.creationalpatterns.simplefactory;
 2
 3
 4 /**
 5  * <p>
 6  * 简单工厂方法:
 7  * <p>
 8  * 把变化的部分(创建对象)封装起来,即通过工厂(factory)来处理创建对象的细节。
 9  * <p>
10  * 简单工厂方法不是一种设计模式,而是一种编程习惯。
11  *
12  * Reference : Head-First-Design-Patterns
13  *
14  */
15
16 public class SimplePizzaFactory {
17
18     /**
19      * 根据实际类型创建相应的对象
20      * @param type
21      * @return
22      */
23     public Pizza createPizza(String type) {
24         Pizza pizza = null;
25
26         if (type.equals("cheese")) {
27             pizza = new CheesePizza();
28         } else if (type.equals("pepperoni")) {
29             pizza = new PepperoniPizza();
30         } else if (type.equals("clam")) {
31             pizza = new ClamPizza();
32         } else if (type.equals("veggie")) {
33             pizza = new VeggiePizza();
34         }
35         return pizza;
36     }
37 }

3、测试类

  简单地创建了PizzaStore和工厂类,PizzaStore实际上使用工厂类进行Pizza对象的创建。

 1 package com.designpatterns.creationalpatterns.simplefactory;
 2
 3 /**
 4  *
 5  * Reference : Head-First-Design-Patterns
 6  *
 7  */
 8
 9 public class PizzaTestApp {
10     public static void main(String[] args) {
11         //创建工厂
12         SimplePizzaFactory factory = new SimplePizzaFactory();
13         PizzaStore pizzaStore = new PizzaStore(factory);
14
15         //order a pizza
16         Pizza pizza = pizzaStore.orderPizza("clam");
17         System.out.println("We ordered a " + pizza.getName() + "\n");
18         System.out.println(pizza);
19
20         //change the pizza type
21         pizza = pizzaStore.orderPizza("veggie");
22         System.out.println("We ordered a " + pizza.getName() + "\n");
23         System.out.println(pizza);
24
25     }
26 }

简单工厂方法有以下几个变种:

  1. 变种1:添加多个创建的方法,负责不同对象的创建。
  2. 变种2:静态工厂方法,把方法设置为static,不用创建工厂实例。缺点:不能通过继承来改变创建方法的行为。

  以上便是简单工厂方法的大致介绍。后面要介绍的工厂方法模式、抽象工厂模式也有相通之处。它们在工厂类的基础上进行了不同的抽象和扩展。

原文地址:https://www.cnblogs.com/wpbxin/p/9065084.html

时间: 2024-10-12 06:08:06

浅析设计模式(四)——创建型模式之simple-factory(简单工厂方法,非设计模式)的相关文章

设计模式之创建型模式

一.前言 设计模式应该是在软件工程的背景下进行讨论的,而不是为了设计模式而论设计模式.设计模式是软件工程面向对象设计工作中一个抽象.归纳.总结的过程.软件设计的最高目标和最高准则就是易扩展,易复用,易维护, 灵活性高,高可用,稳定性高一切的设计原则和设计模式最终的目标都是向这个目标靠拢的. 二.面向对象设计六大原则 任何的设计模式都是基于面向对象的特性(抽象.封装.继承.多态)和设计原则进行设计和实现的,是面向对象设计原则的在不同场景下的实现方案. 抽象:抽离变化的部分,引入抽象层,实现具体实现

Java设计模式之创建型模式

创建型模式分为五类:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 一.工厂方法模式:接口-实现类-工厂类 工厂类的目的是为了产生Sender对象,通过不同的参数传入产生不同的对象. 将工厂类中的工厂方法改为多个工厂方法即为多个工厂方法的设计模式 将工厂类中的工场方法改为static即为静态工厂方法设计模式 二.抽象工厂方法模式:接口-实现类-工厂类 特点是: 工厂类实现某个接口,利于以后扩展,比如可以增加BlueTooth的工厂类. 工厂设计模式是抽象工厂设计模式的一个特例. 三.

设计模式(四):SIMPLE FACTORY简单工厂模式 -- 创建型模式

1.定义 简单工厂模式又称静态工厂方法模式.重命名上就可以看出这个模式一定很简单.它存在的目的很简单:定义一个用于创建对象的接口. 2.适用场景 如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用.后来出现工业革命.用户不用去创建宝马车.因为客户有一个工厂来帮他创建宝马.想要什么车,这个工厂就可以建.比如想要320i系列车.工厂就创建这个系列的车.即工厂可以创建产品. 3.评价 优点: 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体

设计模式之创建型模式(上)

没有总结的学习不算学习,这一个月的学习可谓收获多多啊,接下来与大家分享一下. 一.设计模式的分类 总体来说设计模式分为三大类: 1.创建型模式,共五种. 2.结构型模式,共七种. 3.行为型模式,共十一种. 首先研究创建型模式 二. 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统独 立于如何创建.组合和表示它的那些对象. 三. 为什么需要创建型模式 所有的创建型模式都有两个永恒的主旋律: 第一,它们都将系统使用哪些具体类的信息封装起来: 第二,它们隐藏了这些类的实例

设计模式 (创建型模式)

  设计模式 创建型模式 1.创建型模式         创建型模式,包括了5种设计模式,分别是 Singleton (单例模式),Factory(工厂模式),AbstractFactory(抽象工厂模式),Builder(创建者),Prototype(原型) ,创建型模式主要作用就是抽象了实例化过程.他们帮助一个系统独立于如何创建.组合和表示他的那些对象.一个类创建型模式使用继承改变被实例化的类.而一个对象创建型模式将实例化委托给另一个对象. 2.Singleton (单例模式)      单

设计模式系列 - 创建型模式

单例模式 懒汉式,线程不安全. 除非是单线程程序,否则不推荐使用. public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 饿汉式,线程安全 当程序总是使用这个

设计模式_创建型模式_简单工厂模式

转载自:http://blog.csdn.net/lovelion  作者:刘伟 简单工厂模式并不属于GoF 23个经典设计模式,但通常将它作为学习其他工厂模式的基础,它的设计思想很简单,其基本流程如下:        首先将需要创建的各种不同对象(例如各种不同的Chart对象)的相关代码封装到不同的类中,这些类称为具体产品类, 而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类: 然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方

设计模式1—创建型模式

模式 在一定环境中解决某一问题的方案,包括三个基本元素--问题,解决方案和环境. 大白话:在一定环境下,用固定套路解决问题. 设计模式(Design pattern) 是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 设计模式的分类(Gang of Four的"DesignPatt

设计模式之“创建型模式”

创建型模式主要分为五大模式,分别为:抽象工厂模式.建造者模式.工厂方法模式.原型模式.单例模式. 抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 一.优点 1.易于交换产品系列. 2.它让具体的创建实例过程与客户端分离. 二.反射 Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")需要在程序顶端写上using System.Reflection;来引用Reflection所有用简单工

设计模式_创建型模式——工厂方法

工厂方法(Factory Method):工厂方法模式属于类的创建型模式.在工厂方法模式中,父类负责定义创建产品对象的工厂接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化哪一个类. abstract Product factoryMethod(String type) abstract:工厂方法是抽象的,依赖子类来处理对象的创建 Product:工厂方法返回一个产品,超类中定义的方法,通常使用到工厂方法的返回值 String:工厂方法