设计者模式 -- 工厂方法(FactoryMethod)

在了解工厂方法之前,先了解一下面向对象设计中的开闭原则(OCP)

开闭原则是面向对象设计中“可复用设计的基石”,是面向对象设计中最重要的原则之一,其他的很对设计原则都是实现开闭原则的一种手段。

开闭原则中的“开”是指对于组件功能中的扩展是开放的,是允许对其进行功能扩展的;开闭原则中的“闭”是指对于原有代码的修改是封闭的,即不应该修改原有的代码。就是对扩展开放,对修改关闭。当对某一软件进行扩展是,精良不要修改原有的软件实体,也就是再不修改原有软件实体的情况下对其进行扩展。这种设计方式是一种目标,考虑了软件后期的维护等其他因素。在软件设计中,众多设计模式的应用就是为了达到这个目标。

接下来步入正题:

收看看一下工厂方法的定义:定义一个创建产品对象的工厂接口,将厂品对象的世纪创建工作推迟到具体子工厂类中。这个满足创建型模式中所要求的创建与使用相分离的特点。

简单工厂模式就是说创建产品多部,只要一个工厂类就可完成,这个不属于茎单设计模式,缺点是会打破上面所述的开闭原则。

工厂模式的主要优点:

  • 用户只需要知道具体工厂的名称就可以得到所要的产品,无需知道产品的具体创建过程;
  • 在系统增加新的产品是只需啊哟增加具体产品类以及对应的具体工厂类,无需对原工厂进行修改,满足开闭原则

缺点就是

  • 每增加一个产品就需要增加一个具体的产品类以及对应的具体工厂类,增加了系统的复杂度。

接下来看一下该模式的结构:

  • 抽象工厂(Abstract Factory): 提供创建产品的接口,调用者通过该接口访问具体工厂的工厂方法
  • 具体工厂(ConcreteFactory):主要实现了抽象工厂的抽象方法,完成具体产品的创建
  • 抽象产品(Product):定义了产品规范,描述了产品的主要特性以及功能。
  • 具体产品(ConcreteProduct):实现抽象产品角色所定义的接口,有具体工厂来创建,与具体工厂一一对应。

抽象产品Product

package factoryMethod;

/**
 * 抽象产品:提供产品接口
 */
public interface Product {

    /**
     * 展示产品
     */
    void show();
}

具体产品ConcreteProduct1

package factoryMethod;

/**
 * 具体产品1:实现抽象产品中的接口
 */
public class ConcreteProduct1 implements Product {
    @Override
    public void show() {
        System.out.println("我是具体产品1----");
    }
}

具体产品ConcreteProduct2

package factoryMethod;

/**
 * 具体工厂2:实现抽象工程的生产产品方法
 */
public class ConcreteFactory2 implements AbstractFactory {
    @Override
    public Product newProduct() {
        System.out.println("具体工厂2生产了产品2");
        return new ConcreteProduct2();
    }
}

抽象工厂AbstractFactory

package factoryMethod;

/**
 * 抽象工厂:提供产品的生成方法
 */
public interface AbstractFactory {

    Product newProduct();
}

具体工厂ConcreteFactory1

package factoryMethod;

/**
 * 具体工厂1:实现抽象工程的生产产品方法
 */
public class ConcreteFactory1 implements AbstractFactory {
    @Override
    public Product newProduct() {
        System.out.println("具体工厂1生产了产品1");
        return new ConcreteProduct1();
    }
}

具体工厂ConcreteFactory2

package factoryMethod;

/**
 * 具体工厂2:实现抽象工程的生产产品方法
 */
public class ConcreteFactory2 implements AbstractFactory {
    @Override
    public Product newProduct() {
        System.out.println("具体工厂2生产了产品2");
        return new ConcreteProduct2();
    }
}

客户 ClientFactoryMethod

package factoryMethod;

public class ClientFactoryMethod {    public static void main(String[] args) {        Product product;        AbstractFactory abstractFactory;        // 根据指定的具体工厂名生成工厂实例        abstractFactory = (AbstractFactory) Util.getObject("ConcreteFactory1");        // 生产产品        product = abstractFactory.newProduct();        // 调用产品方法        product.show();    }}

小工具

package factoryMethod;

public class Util {

    public static Object getObject(String name){
        String cName = "factoryMethod." + name;
        System.out.println("新类名:"+cName);
        Class<?> c = null;
        try {
            // 根据名称获取类
            c = Class.forName(cName);
            // 调用该类的无参构造方法并获取实例
            return c.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            // 异常
            e.printStackTrace();
            return c;
        }
    }
}

输出

新类名:factoryMethod.ConcreteFactory1
具体工厂1生产了产品1
我是具体产品1----

源码地址;https://github.com/yang-shixiong/design/tree/master/src/factoryMethod

原文地址:https://www.cnblogs.com/yangshixiong/p/12567004.html

时间: 2024-11-06 16:28:50

设计者模式 -- 工厂方法(FactoryMethod)的相关文章

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实

简单工厂模式\工厂方法模式

工厂模式 一.本节目标 我们本节课程主要介绍[工厂模式]的相关知识,将会涉及以下内容: 什么是工厂模式 工厂模式类图 工厂模式代码 工厂模式应用 PS:学习 Java 设计模式之前最好有一定的 Java 语言基础.由于讲这种东西其实比较枯燥,为了让大家学习起来轻松愉快一点,我会尽量使用一些生动.形象和幽默的例子. 二.什么是工厂模式 工厂模式(Factory Pattern)的意义就跟它的名字一样,在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象.工厂模式根据不同的参数来实现不同的分配

大话设计模式之简单工厂模式&amp;工厂方法模式&amp;抽象工厂模式

创造类模式分为三种:简单工厂模式,工厂模式和抽象工厂模式. 定义: 简单工厂模式:用一个单独的类来做创造实例的过程. 工厂模式:一个用于创建对象的接口,让子类决定实例化哪一个类,讲一个类的实例化 延迟到其子类. 抽象工厂模式:为创建一组相关或相互依赖的对象的类,而不指定具体类. 结构图: 这是简单工厂的结构图,从图中就很好理解. 简单工厂的优点: 根据用户需要,new出需要的对象. 但是简单工厂弊端: 当新加入一个功能是,就要修改工厂.这个时候,就需要工厂模式了. 从图中我们可以看出: 工厂模式

Java的23中设计模式--工厂方法模式(Factory Method)

1.普通工厂模式 工厂类 /** * @Title Factory.java * @Package factory.factory1 * @date 2015-1-22 上午10:16:02 * @version V1.0 */ package factory.factory1; /** * @ClassName Factory * @date 2015-1-22 上午10:16:02 */ public class Factory { public Sender procedure(Strin

factory工厂模式之工厂方法FactoryMethod

工厂方法(Factory Method) * 工厂方法把不同的产品放在实现了工厂接口的不同工厂类(FactoryAImpl,FactoryBImpl...)里面, * 这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响, * 以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码 代码解释: 1.创建产品接口Product,并创建2个产品子类android手机.Apple手机,都实现Product接口 public interface Product

第4章 创建型模式—工厂方法模式(2)

2. 工厂方法模式 2.1工厂方法模式的定义 (1)定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使一个类的实例化延迟到其子类 ①Product:定义了工厂方法创建对象的接口.也就是实际需要使用的产品对象的接口 ②ConcreteProduct:具体的Product接口的实现对象. ③Factory(Creator):定义了工厂方法的抽象类并返回一个产品对象. ④ConcreteCreator:具体的创建器对象,该类实现和覆盖了父工厂类声明的方法.返回一个具体的Product实例

简单工厂模式--工厂方法模式(简介)

一.简单工厂模式(静态工厂) 简单工厂模式不属于23种标准设计模式 简单工厂模式是工厂方法模式的一个特殊的实现 简单工厂就是由一个工厂类根据传入的参数决定创建出哪一种产品类的实例  二.实现 产品接口或者抽象类 package factory; /* * 产品接口 */ public interface Product { //生产工艺 public void craftwork(); //产品类型 public void type(); } 实现的子类 package factory; /*

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

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

工厂模式--工厂方法模式(Factory Method Pattern)

2.1. 模式动机 现在对该系统进行修改,不再设计一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成,我们先定义一个抽象的按钮工厂类,再定义具体的工厂类来生成圆形按钮.矩形按钮.菱形按钮等,它们实现在抽象按钮工厂类中定义的方法.这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品,如果出现新的按钮类型,只需要为这种新类型的按钮创建一个具体的工厂类就可以获得该新按钮的实例,这一特点无疑使得工厂方法模式具有超越简单工厂模式的优越性,更加符合"开闭