您的位置:首页 > 编程语言 > Java开发

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

2015-10-10 01:36 489 查看

一、什么是简单工厂模式

简单工厂模式也称为静态工厂模式,是一种创建型模式,就是告诉人们怎么去“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内加入一条分支。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式 Java 笔记