Factory Method (工厂模式)

什么是工厂设计模式

根据名字即可了解,工厂肯定是用来生产产品的,在我们的程序开发中,需要用到不同的类,对于熟悉SSH、SSM开发的可以知道,在初期学习的时候,总是有一个框架提供好的的factory供我们使用,利用它可以创建访问数据库的连接等操作。

定义:

利用template method设计模式创建我们想要的实例,就称之为factory method。

具体到面向对象

  • 《framework》生成实例框架:可以理解为在我使用factoy method时这个是必须的,组成元素在这个包下
  • 《product》: 具体的产品类,你需要生成什么就可以创建自己的产品。加工处理

UML 代码

这个例子就是实现创建一个身份证,然后使用它

  • framework包下
    - Factory :创建实例的方法 这里要注意创建 注册都是维护的protected方法

    • Product : 定义操作的方法
  • product包下
    - IdCard :具体的产品
    - IdCardFactory :实现了具体的创建。
  • Factory
package base.factory.framework;

/**
 * @program: DesignPatterns
 * @description: 创建实例的类
 * @author: Mr.Dai
 * @create: 2018-05-07 15:48
 **/
public abstract class Factory {

    public final Product create(String name){
        Product product = createProduct(name);
        registerProduct(product);
        return product;
    }

    protected abstract Product createProduct(String name);
    protected abstract void registerProduct(Product product);
}
  • Product

package base.factory.framework;

/**
 * @program: DesignPatterns
 * @description: 定义具体方法的类
 * @author: Mr.Dai
 * @create: 2018-05-07 15:51
 **/
public abstract class Product {

    public abstract void use();

}
  • IdCard

package base.factory.idcard;

import base.factory.framework.Product;

/**
 * @program: DesignPatterns
 * @description: 具体的身份类
 * @author: Mr.Dai
 * @create: 2018-05-07 15:57
 **/
public class IdCard extends Product {

    private String name;

    IdCard(String name){
        System.out.println("创建了"+name+"的身份证");
        this.name=name;
    }
    @Override
    public void use() {
        System.out.println("使用了"+name+"的身份证");
    }

    public String getOwer(){
        return this.name;
    }
}
  • IdCardFactory

package base.factory.idcard;

import base.factory.framework.Factory;
import base.factory.framework.Product;

import java.util.Vector;

/**
 * @program: DesignPatterns
 * @description: 生产身份证具体的类
 * @author: Mr.Dai
 * @create: 2018-05-07 16:00
 **/
public class IdCardFactory extends Factory {

    private Vector idcards=new Vector<String>();

    @Override
    public Product createProduct(String name) {
        return new IdCard(name);
    }

    @Override
    public void registerProduct(Product product) {
            idcards.add(((IdCard)product).getOwer());
    }

    public Vector<String> getIdCards(){
        return idcards;
    }
}
  • 结果

具体说明

  • product:是生成实例具有的接口方法,具体处理由子类决定
  • CreatedProduct:具体的产品 由idcard承担
  • CreatedCreator:具体的创建者 由IdCardFactory承担
  • IdCardFactory是具体的承担者,父类Factory将会解除与子类的耦合,实际上是子类具体的创建者来生成具体的实例。
  • 实际运用中,我们没有必要去修改framework下的任何内容,假设我们这里要维护一台电视机,只需要创建具体的类即可。

实例产生的三种方式

  • 指定为抽象方法

public abstract class Factory {

    public final Product create(String name){
  • 直接生成
public abstract class Factory {

    public  Product create(String name){
  return new Product(name);//这样的话,product就不能为抽象类

Televison 电视类 并且实现 保存编号 以及所有者之间的对应表

  • Televison
package base.factory.television;

import base.factory.framework.Product;

/**
 * @program: DesignPatterns
 * @description: 电视类
 * @author: Mr.Dai
 * @create: 2018-05-07 16:40
 **/
public class Televison extends Product {

    private String name;
    Televison(String name){
        this.name=name;
    }

    @Override
    public void use() {
        open();
        runing();
        close();
    }

    public void open(){
        System.out.println("开电视"+name);
    }
    public void runing(){
        System.out.println("看电视"+name);
    }
    public void close(){
        System.out.println("关闭电视"+name);
    }

    public String getName(){
        return  this.name;
    }
}
  • TelevisionFactory
package base.factory.television;

import base.factory.framework.Factory;
import base.factory.framework.Product;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

/**
 * @program: DesignPatterns
 * @description: 创建televi
 * @author: Mr.Dai
 * @create: 2018-05-07 16:45
 **/
public class TelevisionFactory  extends Factory {

    private TreeMap<Integer,String> teleS=new TreeMap<>();
    private int i=0;
    @Override
    protected Product createProduct(String name) {
        return new Televison(name);
    }

    @Override
    protected void registerProduct(Product product) {
        teleS.put(++i,((Televison)product).getName());
    }
    public TreeMap getTeles(){
        return  teleS;
    }
}

相关设计模式

  • template method :factory method就是模板设计模式的延伸。
  • singleton :单例模式,这里我们的产品可以改为单例模式,我们实际运用中使用的到的类比如hibernate中的,都是单例的 如数据库连接等。
  • Composite: composite模式用于product角色
  • Iterator: 在Iterator模式中使用iterator方法生成Iterator实例会使用Factory Method。

还有一个问题是,使用Factory Method 设计模式,必须在具体的Product作注释,不然使用者必须了解上层代码,或者维护可能会修改使用者的具体用意。

原文地址:https://www.cnblogs.com/dgwblog/p/9003648.html

时间: 2024-11-02 01:37:51

Factory Method (工厂模式)的相关文章

工厂方法(Factory Method)模式

一.工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟的子类中. 工厂方法模式是简单工厂模式的进一步抽象和推广.由于使用了多态性,工厂方法模式保持了简单工厂模式的有点,而且客服了它的缺点. 在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给予子类去做.这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节.这使得工厂方法模式可以允许

Factory Method 工厂方法模式

Factory method工厂方法模式是一种实现了“工厂”概念的面向对象设计模式.就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题.工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行.” 创建一个对象常常需要复杂的过程,所以不适合包含在一个复合对象中.创建对象可能会导致大量的重复代码,可能会需要复合对象访问不到的信息,也可能提供不了足够级别的抽象,还可能并不是复合对象概念的一部分.工厂方法模式通

一天一个设计模式——Abstract Factory抽象工厂模式

一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂方法模式中,抽象工厂使用抽象的零件组装成抽象的产品.即使用包含特定的方法接口零件,将零件组装成抽象产品. 二.模式类图: 上面的类图中包含两个包:包含抽象工厂,抽象零件,抽象产品的类所在的包以及具体工厂实现类的包. 三.代码示例 1.Item类: package com.designpattern.

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

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

设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要强调一系列相关的产品对象的设计以便进行联合使用. 4.当你提供一个产品类库,而只想显示它们的接口而不是实现. 3.评价 1.它分离了具体的类 2.它使得易于交换产品系列 3.它有利于产品的一致性 4.难以支持新种类的产品 5."开放-封闭"原则要求系统对扩展开放,对修改封闭.通过扩展达到增

Factory Method(工厂方法)-对象创建型模式

1.意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 2.动机 框架使用抽象类定义和维护对象之间的关系.这些对象的创建通常也由框架负责. 3.适用性 当一个类不知道它所必须创建的对象的类的时候. 当一个类希望由它的子类来指定它所创建的对象的时候. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一局部化的时候. 4.结构 5.代码实例 class Product { public: vir

c++ 设计模式8 (Factory Method 工厂方法)

5. "对象创建"类模式 通过"对象创建"类模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 5.1 工厂方法 动机: 在软件系统中,经常面临着创建对象的工作:由于需求的变化,需要创建的对象的具体类型经常变化. 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种"封装机制"来避免客户程序和这种"具体对象创建工作"的紧耦合? 代码示例

设计模式(四)The Factory Pattern 工厂模式

一.简单工厂 定义:定义一个创建对象的接口,但是由其子类决定要实例化的对象是哪一个,工厂方法让类的实例化推迟到子类. 通俗的来讲就是由工厂方法确定一个框架,具体的实现由其子类来完成.与简单工厂相比,简单工厂可是完成了整个对象的创建. 严格的来说简单工厂并不是一种设计模式,他更像是一种编程习惯. 代码说明一切! 1.这是一个简单工厂 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package my.oschina

深入浅出设计模式 ------ Factory Method(工厂方法)

1. 定义: 一个用于创建对象的接口, 让子类决定实例化哪个类. 工厂方法使一个类的实例化延迟到子类. 2. 结构 3. 参与者(如上图) Product ---- 定义工厂方法所创建的对象接口 ConcreteProduct ---- 实现Product接口 Creator ---- 声明工厂方法, 该方法返回一个Product类型的对象 ConcreteCreator ---- 重新定义工厂方法返回一个ConcreteProduct实例 4. 实现 (1) 特例: 简单工厂(Simple F

c++ 设计模式9 (Abstract Factory 抽象工厂模式)

5.2 抽象工厂模式 动机:在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 代码示例: 实现利用数据库的业务逻辑,支持多数据库(Sql,Oracle等),有连接.命令.读取等功能. 其中命令,连接功能之间有相互联系. 方法一(使用工厂方法): 每个功能类有一个创建的工厂,如IDBConnection与IDBConnectionFactory 1 //数据库访问有关的基类 2 class IDBConnection{ 3