设计模式——简单工厂模式

一、什么是简单工厂模式

简单工厂模式也称为静态工厂模式,是一种创建型模式,就是告诉人们怎么去“new”的。简单工厂模式通过一个简单的工厂来实现对象的创建。

二、UML图

这里写图片描述

三、模式原型代码

/**
 *  需要生产的产品抽象类
 */
public abstract class AbstractProduct {

    /**
     * 产品类的抽象行为
     */
    public abstract void Action();

}

/**
 * 具体产品类1,继承自抽象产品类
 */
public class ConcreteProduct1 extends AbstractProduct{

    /**
     * 重载的具体产品动作
     */
    @Override
    public void Action() {
        System.out.println("This is the action of ConcreteProduct1.");
    }

}

/**
 * 具体产品类2,同样继承自抽象产品类
 */
public class ConcreteProduct2 extends AbstractProduct{

    /**
     * 重载的具体产品2的行为方法
     */
    @Override
    public void Action() {
        System.out.println("This is the action of ConcreteProduct2.");
    }

}

/**
 * 产品工厂方法,包含一个抽象产品对象,职责是通过传入不同的参数来生产不同的具体产品
 */
public class ProductFactory {

    public static AbstractProduct createProduct(String str){
        AbstractProduct product = null;

        //--- 根据不同的参数生产不同的产品对象
        switch (str) {
        case "ConcreteProduct1":
            product = new ConcreteProduct1();
            break;
        case "ConcreteProduct2":
            product = new ConcreteProduct2();
            break;
        }

        return product;
    }

}

/**
 * 客户端类,用于测试
 */
public class Client {

    public static void main(String[] args) {
        //--- 通过产品工厂生产具体的产品类
        AbstractProduct product1 = ProductFactory.createProduct("ConcreteProduct1");
        AbstractProduct product2 = ProductFactory.createProduct("ConcreteProduct2");

        //--- 验证多态性
        product1.Action();
        product2.Action();
    }

}

四、一个例子

说明:该实例场景如下:
现在一个数学老师需要为学生讲解各种几何图形,每个几何图形都有自己对自己的描述,老师希望通过输入不同的名称,程序可以自动显示出该几何图形的描述
/**
 * 图形抽象类
 */
public abstract class Shape {

    /**
     * 几何图形的名称
     */
    private String name;

    /**
     * 构造方法,传入几何图形名称
     */
    public Shape(String name){
        this.name = name;
    }

    /**
     * 名称getter
     */
    public String getName() {
        return name;
    }

    /**
     * 名称setter
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 图形描述方法
     */
    public abstract void description();

}

/**
 * 三角形类,继承自图形类
 */
public class Triangle extends Shape{

    public Triangle(String name){
        super(name);
    }

    /**
     * 三角形的描述
     */
    @Override
    public void description() {
        System.out.println("我是三角形类,我有如下特点:");
        System.out.println("        1.有三条边");
        System.out.println("        2.两边之和大于第三边,两边只差小于第三边");
        System.out.println("        3.面积是底乘高除2");
        System.out.println("        ...");
    }

}

/**
 * 矩形类
 */
public class Retangle extends Shape{

    /**
     * 矩形类构造函数,传入名字
     */
    public Retangle(String name){
        super(name);
    }

    /**
     * 矩形类描述
     */
    @Override
    public void description() {
        System.out.println("我是矩形类,我有如下特性:");
        System.out.println("        1.我有四条边");
        System.out.println("        2.四条边两两相等");
        System.out.println("        3.面积是长乘宽");
        System.out.println("        ...");
    }

}

/**
 * 正方形类
 */
public class Square extends Shape{

    /**
     * 正方形构造方法,传入名称
     */
    public Square(String name){
        super(name);
    }

    /**
     * 正方形描述函数
     */
    @Override
    public void description() {
        System.out.println("我是正方形类,我有如下特性:");
        System.out.println("        1.我有四条边");
        System.out.println("        2.四条边都相等");
        System.out.println("        3.面积是边长的平方");
        System.out.println("        ...");
    }

}

/**
 * 图形类工厂,用于生产各种图形对象
 */
public class ShapeFactory {

    public static Shape createShape(String name) {
        Shape shape = null;
        switch (name) {
        case "正方形":
            shape = new Square(name);
            break;
        case "矩形":
            shape = new Retangle(name);
            break;
        case "三角形":
            shape = new Triangle(name);
            break;
        default:
            System.out.println("图形输入错误,程序结束。");
            System.exit(1);
        }

        return shape;
    }

}

import java.util.Scanner;

/**
 * 客户端类,用于测试
 */
public class Client {

    public static void main(String[] args) {
        String name = null;
        Scanner input = new Scanner(System.in);
        Shape shape = null;
        System.out.println("请输入图形名称:");
        name = input.nextLine();
        shape = ShapeFactory.createShape(name);
        shape.description();
        input.close();
    }

}

五、简单工厂模式的优缺点

    优点:初步降低了创建相似对象的耦合性(将客户端和产品类解耦),由于客户端和产品类的耦合性减低,使得在修改产品类的时候不需要修改客户端,该模式体现了面向对象设计的思想——可复用、易维护、灵活度高等特点,同时也是面向接口编程思想的一种体现。

    缺点:违反了开放——封闭原则。开放封闭原则即:程序对已扩展应该是开放的,对于修改应该是封闭的。通俗来说,就是只能增加新的代码,而不能修改原来已有的代码。违反这一原则的点在于产品类和工厂类的耦合,导致新增产品类的同时必须要向工厂类的switch内加入一条分支。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值