设计模式之工厂模式与工厂方法模式

工厂模式类图

简单工厂模式代码

package pattern.factory;

/**
 * @ClassName IShape
 * @Description TODO:描述该接口职责
 * @Author ckmike
 * @Date 18-12-14 上午11:33
 * @Version 1.0
 * @Copyright ckmike
 **/
public interface IShape {
    void draw();
    double area();
}

package pattern.factory;

/**
 * Circle 简要描述
 * <p> TODO:描述该类职责 </p>
 *
 * @author ckmike
 * @version 1.0
 * @date 18-12-14 上午11:34
 * @copyright ckmike
 **/
public class Circle implements IShape {

    private double r;

    public Circle(double r) {
        this.r = r;
    }

    @Override
    public void draw() {
        System.out.println("绘制r:"+this.r+"圆形。");
    }

    @Override
    public double area() {
        return Math.PI*this.r*this.r;
    }
}

package pattern.factory;

/**
 * Rectangle 简要描述
 * <p> TODO:描述该类职责 </p>
 *
 * @author ckmike
 * @version 1.0
 * @date 18-12-14 上午11:34
 * @copyright ckmike
 **/
public class Rectangle implements IShape {

    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public void draw() {
        System.out.println("绘制width="+this.width+",height="+this.height+"矩形。");
    }

    @Override
    public double area() {
        return this.width*this.height;
    }
}

package pattern.factory;

/**
 * Square 简要描述
 * <p> TODO:描述该类职责 </p>
 *
 * @author ckmike
 * @version 1.0
 * @date 18-12-14 上午11:35
 * @copyright ckmike
 **/
public class Square implements IShape {

    private double width;

    public Square(double width) {
        this.width = width;
    }

    @Override
    public void draw() {
        System.out.println("绘制width:"+this.width+"正方形。");
    }

    @Override
    public double area() {
        return this.width*this.width;
    }
}

package pattern.factory;

/**
 * @FileName ShapeType
 * @Description TODO:描述该枚举职责
 * @Author ckmike
 * @Date 18-12-14 下午12:34
 * @Version 1.0
 * @Copyright ckmike
 **/
public enum ShapeType {

    /**
     * 圆形
     **/
    Circle("Circle", 1),
    /**
     * 矩形
     **/
    Rectangle("Rectangle", 2),
    /**
     * 正方形
     **/
    Square("Square",3);

    private String name;
    private int index;

    private ShapeType(String name, int index) {
        this.name = name;
        this.index = index;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public int getIndex() {
        return index;
    }
    public void setIndex(int index) {
        this.index = index;
    }
}

package pattern.factory;

/**
 * ShapeFactory 简要描述
 * <p> TODO:描述该类职责 </p>
 *
 * @author ckmike
 * @version 1.0
 * @date 18-12-14 下午12:12
 * @copyright ckmike
 **/
public class ShapeFactory {

    // 获取指定类型的图形对象
    public static IShape getShape(String type,double... paramters){
        switch (type){
            case "Circle":
                return new Circle(paramters[0]);
            case "Rectangle":
                return new Rectangle(paramters[0],paramters[1]);
            case "Square":
                return new Square(paramters[0]);
            default:
                {
                    System.out.println("图形:"+type+"不存在,请确认后重写设置.");
                    return null;
                }
        }
    }
}

package pattern;

import pattern.factory.IShape;
import pattern.factory.ShapeFactory;
import pattern.factory.ShapeType;

/**
 * FactoryDemo 简要描述
 * <p> TODO:描述该类职责 </p>
 *
 * @author ckmike
 * @version 1.0
 * @date 18-12-14 上午11:32
 * @copyright ckmike
 **/
public class FactoryDemo {

    public static void main(String[] args) {
        IShape circle = ShapeFactory.getShape(ShapeType.Circle.getName(), 10);
        circle.draw();
        System.out.println("面积:"+circle.area());
    }
}


说明:
简单工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。

分析:
对于上述的工厂模式,我们如果需要新增加一个图形,那么我们需要:
1.创建图形类,实现IShape接口
2.在枚举类中新增一个常量对应该图形类
3.需要修改ShapeFactory类的getShape方法,添加case
这种模式并不符合开关原则。针对这个问题我们可以这么做如下:

分析:这种方式不需要ShapeType枚举类,不需要修改ShapeFactory类,但是这样针对每一个对象去设置工厂类会存在一个问题就是会有大量的对象工厂类,虽然符合开关原则。有点就是:新增图形时,只要增加一个图形类和对应的工厂类。缺点就是会有大量的对象工厂类。这种方式就是工厂方法模式。

工厂方法模式

分析:工厂方法模式代码我就不写了,因为这张类图就非常清晰的表示了,结合工厂模式的理解,你就可以很轻松的实现这个模式。这个模式符合开关原则。缺点就是会有大量的具体工厂类。工厂模式与工厂方法模式的选择取决于你对未来扩展要求的判断,如果未来扩展可能性极地甚至不可能,那么就可以选择工厂模式,如果未来扩展要求非常强烈且可能性很大选择工厂方法模式更为合适,尽管会增加大量的具体工厂类,但不需要修改原来的代码。

原文地址:http://blog.51cto.com/4837471/2330400

时间: 2024-10-03 18:53:54

设计模式之工厂模式与工厂方法模式的相关文章

【C#设计模式——创建型模式】工场方法模式

工场方法模式对简单工场模式进行了乔庙的扩展,不是用一个专门的类来决定实例化哪一个子类.相反,超类把这种决定延迟到每个子类.这种模式实际上没有决策点,就是没有直接选择一个子类实例化的决策. 看书上的例子有点复杂,自己写了一个简单例子: 示例目标:对数组进行定向排序 基类FormatList对指定数组进行排序,具体实现交给子类实现 public abstract class FormatList { public int[] result; protected abstract void Forma

23种设计模式(6):模版方法模式

定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤. 类型:行为类模式. 类图: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来.经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就有点麻烦了.但是A有办法,先把打印功能完成,排序功能另找人做. abstract class AbstractS

原型模式和模版方法模式

首先我们来了解原型模式 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 根据定义,我们很明显地知道原型模式的对象是类.通过原型模式,我们可以无限地复制原型的对象 接着我们了解模版方法模式 定义:定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中.模版方法使用使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 其实就是规定完成某件事情需要做多少步,并且规定那些需要你发挥自己的想象.能力根据实际情况去完成的. 综上所述.这两种设计模式的对象不同.原型是一个大的

23种设计模式(1) - 工厂方法模式

1.定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 2.举例 有一个Animal接口,有两个类Dog和Cat分别继承了该接口.我们通过一个叫AnimalDactory的工厂类接口,再定义DogFactory和CatFactory类来分别创建Dog和Cat实例,由调用端来决定使用哪个工厂来创建对象. 3.代码 // 创建 动物 接口 public interface Animal { void sayName(); } // 创建 猫和狗 类 p

设计模式(java)--模版方法模式之任务分配

转自:http://blog.csdn.net/zhengzhb/article/details/7405608 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤. 类型:行为类模式 类图: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来.经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就

php设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式. 一.设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用.容易被他人理解的.可靠的代码设计经验的总结. 设计模式不是Java的专利,我们用面向对象的方法在PHP里也能很好的使用23种设计模式. 那么我们常说的架构.框架和设计模式有什么关系呢? 架构是一套体系结构,是项目的整体解决方案:框架是可供复用的半成品软件,是具体程序代码.架构一般会涉及到采用什么样的框架来加速和优化某部分问题的解决,而好的框架代

(4)模版方法模式

(4)模版方法模式 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤. 类型:行为类模式 类图: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来.经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就有点麻烦了.但是A有办法,先把打印功能完成,排序功能另找人做. abstract class

模版方法模式

第八个模式:模版方法模式 8.1引入模版方法模式 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现 下面我们来看模板方法模式的类图: 8.2模板方法的应用 1.使用模板方法排序(很简单,只是需要实现compareTo接口): 现在就可以测试这个类了: 8.3小结

《JAVA与模式》之模板模式(转载)

模板方法在servlet中的应用:http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html 原文出处:http://blog.csdn.net/zhengzhb/article/details/7405608   定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤. 类型:行为类模式 类图: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,

Java设计模式—工厂方法模式&amp;抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义:Creator为抽象创建 类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的. 工厂方法模式的扩展方式有很多种,下边是工厂方法模式一个比较实用的源代码: 抽象产品类: pub