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

一、简单工厂模式(静态工厂)

简单工厂模式不属于23种标准设计模式

简单工厂模式是工厂方法模式的一个特殊的实现

简单工厂就是由一个工厂类根据传入的参数决定创建出哪一种产品类的实例

 二、实现

产品接口或者抽象类

package factory;
/*
 * 产品接口
 */
public interface Product {

    //生产工艺
    public void craftwork();
    //产品类型
    public void type();
}

实现的子类

package factory;
/*
 * 鲜奶类
 */
public class Creamery implements Product {

    @Override
    public void craftwork() {
        System.out.println("牛奶+除菌=鲜奶!");

    }

    @Override
    public void type() {
        System.out.println("生产鲜奶!!");

    }

}
package factory;
/*
 * 酸奶类
 */
public class Yoghourt implements Product {

    @Override
    public void craftwork() {
        System.out.println("牛奶+酵母菌+粮=酸奶!");

    }

    @Override
    public void type() {
        System.out.println("生产了酸奶!");

    }

}

异常

package factory;
/*
 * 自定义异常
 */
public class BadException extends Exception {

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    public BadException(String message) {
        super(message);
    }

}

静态工厂

package factory;
/*
 * 静态工厂
 */
public class StaticFactory {
    //根据传入的参数返回不同的产品
    public static Product factory(String str) throws BadException{
        if(str.equalsIgnoreCase("Creamery")){
            System.out.println("========生产鲜奶!========");
            return new Creamery();
        }else if(str.equalsIgnoreCase("Yoghourt")){
            System.out.println("=======生产酸奶!==========");
            return new Yoghourt();
        }else{
            throw new BadException("没有这个产品!");
        }
    }
}

测试类

package factory;
/*
 * 测试类
 */
public class Test {

    public static void main(String[] args) {

        try {
            //通过工厂创建产品也可以使用输入来传值
            Product cProduct=StaticFactory.factory("Creamery");
            cProduct.craftwork();
            cProduct.type();
            //通过工厂创建产品也可以使用输入来传值
            Product yProduct=StaticFactory.factory("Yoghourt");
            yProduct.craftwork();
            yProduct.type();

        } catch (BadException e) {
            e.printStackTrace();
        }

    }

}

结果:

========生产鲜奶!========
牛奶+除菌=鲜奶!
生产鲜奶!!
=======生产酸奶!==========
牛奶+酵母菌+粮=酸奶!
生产了酸奶!

三、工厂方法模式--多态性工厂模式

工厂类不再负责所有产品的创建,仅负责给出具体工厂子类必须实现的接口

package factorymethod;
/*
 * 产品接口
 */
public interface Product {

    //生产工艺
    public void craftwork();
    //产品类型
    public void type();
}
package factorymethod;
/*
 * 鲜奶类
 */
public class Creamery implements Product {

    @Override
    public void craftwork() {
        System.out.println("牛奶+除菌=鲜奶!");

    }

    @Override
    public void type() {
        System.out.println("生产鲜奶!!");

    }

}
package factorymethod;
/*
 * 酸奶类
 */
public class Yoghourt implements Product {

    @Override
    public void craftwork() {
        System.out.println("牛奶+酵母菌+粮=酸奶!");

    }

    @Override
    public void type() {
        System.out.println("生产了酸奶!");

    }

}
package factorymethod;

import factory.Product;
/*
 * 产品工厂
 */
public interface ProductFactory {
    //返回类型为产品接口
    public Product factory();

}
package factorymethod;

import factory.Creamery;
import factory.Product;
/*
 * 鲜奶工厂
 */
public class CreameryFactory implements ProductFactory {

    @Override
    public Product factory() {
        System.out.println("========生产鲜奶!========");
        return new Creamery();
    }

}
package factorymethod;

import factory.Product;
import factory.Yoghourt;
/*
 * 酸奶工厂
 */
public class YoghourtFactory implements ProductFactory {

    @Override
    public Product factory() {
        System.out.println("=======生产酸奶!==========");
        return new Yoghourt();
    }

}

测试类

package factorymethod;
/*
 * 工厂方法测试类
 */
public class Test {

    public static void main(String[] args) {
        //创建产品工厂对象并实例化为鲜奶工厂
        ProductFactory cf=new CreameryFactory();
        cf.factory().craftwork();
        cf.factory().type();
        //创建产品工厂对象并实例化为酸奶工厂
    ProductFactory yf=new CreameryFactory();
    //调用产品工厂的方法
    yf.factory().craftwork();
    yf.factory().type();
    }

}

结果:

========生产鲜奶!========
牛奶+除菌=鲜奶!
========生产鲜奶!========
生产鲜奶!!
========生产鲜奶!========
牛奶+除菌=鲜奶!
========生产鲜奶!========
生产鲜奶!!

如果要添加新新产品,只需要添加新的产品接口子类和产品工厂子类就可以了

完全支持开闭原则

时间: 2024-10-11 21:30:58

简单工厂模式--工厂方法模式(简介)的相关文章

23中设计模式----------模版方法模式

模板方法模式: 模板方法模式,就是定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构可重新定义该算法的某些特定步骤. 简而言之,就是定义一个抽象类,在该抽象类中,有一些需要子类特定实现的方法,和一个基本已经实现不改变的方法,而在这个固定的方法中调用那些需要子类实现的方法,从而达到一些步骤延迟到子类中. 所以,在模板方法模式中一般有两类方法: 1,基本方法. 该方法是由子类实现的,并且在模板方法被调用. 2,模板方法. 一般是一个具体的方法,实现对基本方法的调度,

设计模式之模版方法模式

1.模版方法模式简介: a.模版方法模式的简单介绍: -  模版方法模式是编程中经常用到模式.它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个算法结构的前提上重新定义该算法的某些特定步骤. b.核心:处理某个流程中的代码已经都具备,但是其中某个节点的代码暂时不能确定.因此,我们采用模版方法模式,将这个节点的代码实现转移给子类中完成.即:处理步骤父类中定义好,具体实现延迟到子类中定义. 2.简单的代码演示: 在 BankTemplateMethod 类中添加

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

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

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

结合简单示例和UML图,讲解工厂模式简单原理. 一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上 Audi后他说"开奥迪车!".你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是这种有

工厂模式:简单工厂、工厂方法、抽象工厂

一.简介 工厂模式主要是为创建对象提供接口,让子类决定实例化哪个类.按照<Java与模式>可以分为: 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 二.简单工厂 适用于业务简单的情况:小项目或具体产品扩展很少的情况. 它由以下三种角色组成: 具体工厂类 抽象产品类 具体产品来 UML类图关系如下: 三.工厂方法 概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法将一个类的实例化延迟到其子类. 有以下角色组成: 抽象工厂类 具体工厂类 抽象产品类 具体产品类 UML类图

设计模式之_简单工厂模式、工厂方法模式、抽象工厂模式 、策略模式、策略与工厂的区别(转)

一.前言 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”.你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的 幸运的是这种有病的现象在OO语言中可以避免了.下面以Java语言为基础来引入我们本文的主题:工厂模式! 二.简介

说谎的简单工厂模式设计模式&amp;amp;工厂方法模式&amp;amp;Abstract Factory模式

工厂模式被分成三个:简单工厂模式,抽象工厂模式和工厂模式. 定义: 简单工厂模式:用一个单独的类来做创造实例的过程. 工厂模式:一个用于创建对象的接口.让子类决定实例化哪一个类,讲一个类的实例化 延迟到其子类. 抽象工厂模式:为创建一组相关或相互依赖的对象的类,而不指定详细类. 结构图: 这是简单工厂的结构图,从图中就非常好理解. 简单工厂的长处: 依据用户须要,new出须要的对象. 可是简单工厂弊端: 当新增加一个功能是.就要改动工厂. 这个时候,就须要工厂模式了. watermark/2/t

简单工厂、工厂方法模式、抽象工厂模式

只为每天积累一点点... 简单工厂.工厂方法模式.抽象工厂模式的简单原理. 一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”.你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是这种有病的现象在OO语言中可

具体聊一聊简单工厂模式、工厂方法模式和抽象工厂模式

1.工厂模式简介 In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal with the problem of creating objects without having to specify the exact class of the object that will be created. ( 在基于类的编程中,工厂