创建型设计模式:
对类的实例化过程进行抽象,能够使软件模块做到与对象的创建和组织无关,创建型模式隐藏了对象的创建细节,通过隐藏对象如何被创建和组合在一起达到能够使整个系统独立的目的。
设计模式 | 定义 |
简单工厂模式(Simple Factory) | 定义一个类,根据参数的不同返回不同类的实例,这些类具有共有的父类和一些公共的方法 简单工厂模式不属于GOF设计模式,是最简单的工厂模式 |
工厂方法模式(Factory Method Pattern) | 定义一个用于创建对象的接口,让子类决定哪一个类实例化 |
抽象工厂模式(Abstract Factory Pattern) | 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类 |
建造者模式(Builder Pattern) | 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 |
原型模式(Prototype) | 用原型实例化指定创建对象的种类,并且通过拷贝这个原型来创建新的对象 |
单例模式(SingletonPattern) | 保证一个类仅有一个实例,并且提供一个访问它的全局访问点 |
简单工厂:
又称为静态工厂方法模式(Static Factory Method Pattern)属于创建型模式,简单工厂可以根据参数的不同返回不同类的实例。
Factory表示工厂类,是整个模式的核心,负责实现创建所有实例的内部逻辑,工厂类可以被外界直接调用,创建所需的产品
product表示抽象产品
concreteProduct是具体产品
简单工厂模式图:
ShapeFactory 充当工厂类
Shape充当抽象产品
具体产品:Circle,Rectangle,Triangle
抽象产品:形状接口Shape
工厂类:
Circle
测试结果:
简单工厂模式图:
ShapeFactory 充当工厂类
Shape充当抽象产品
具体产品:Circle,Rectangle,Triangle
抽象产品:形状接口Shape
工厂类:
package Factory;
import AbstractProduct.Shape;
import ConcreteProduct.Circle;
import ConcreteProduct.Rectangle;
import ConcreteProduct.Triangle;
import Error.UnsupportShapeException;
public class ShapeFactory {
//静态工厂方法
public static Shape createShape(String type)throws UnsupportShapeException{
if(type.equalsIgnoreCase("c")){
return new Circle();
}
else if(type.equalsIgnoreCase("r")){
return new Rectangle();
}
else if(type.equalsIgnoreCase("t")){
return new Triangle();
}
else{
throw new UnsupportShapeException("不支持该形状");
}
}
}
抽象产品类:Shape
package AbstractProduct;
public interface Shape {
public void draw();
public void erase();
}
具体产品类:
Circle
package ConcreteProduct;
import AbstractProduct.Shape;
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
@Override
public void erase() {
System.out.println("擦除圆形");
}
}
Rectangle
package ConcreteProduct;
import AbstractProduct.Shape;
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("绘制矩形");
}
@Override
public void erase() {
System.out.println("擦除矩形");
}
}
Triabgle
package ConcreteProduct;
import AbstractProduct.Shape;
public class Triangle implements Shape {
@Override
public void draw() {
System.out.println("绘制三角形");
}
@Override
public void erase() {
System.out.println("擦除三角形");
}
}
测试类:
package Test;
import AbstractProduct.Shape;
import Error.UnsupportShapeException;
import Factory.ShapeFactory;
public class Test {
public static void main(String args[]){
try {
Shape shape;
shape=ShapeFactory.createShape("t");
shape.draw();
shape.erase();
} catch (UnsupportShapeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
异常类:
package Error;
public class UnsupportShapeException extends Exception{
public UnsupportShapeException (String message){
super(message);
}
}
测试结果:
缺点:工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响;同时系统的扩展也比较困难,一旦添加新产品就不得不修改工厂逻辑,违反了开闭原则,并且造成工厂逻辑过于复杂。
工厂方法模式:
又称虚拟构造器模式或者多态模式
Product 表示抽象产品,它定义了产品的接口
ConcreteProduct表示具体产品,它实现了抽象产品的接口
Factory表示抽象工厂,它声明工厂方法(Factory Method),返回一个产品
ConcreteFactory表示具体工厂,它实现工厂方法,由客户端调用。返回一个产品的实例
工厂方法模式实例之日志记录器
抽象产品
package Product;
public interface Log {
public void writeLog();
}
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">具体产品:文件日志</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="java">package ConcreteProduct;
import Product.Log;
public class FileLog implements Log{
@Override
public void writeLog() {
System.out.println("文件日志记录");
}
}
具体产品:数据库日志
package ConcreteProduct;
import Product.Log;
public class DatabaseLog implements Log{
@Override
public void writeLog() {
System.out.println("数据库日志记录");
}
}
日志记录器工厂接口:抽象工厂
package Factory;
import Product.Log;
public interface LogFactory {
public Log createLog();
}
具体工厂:文件日志工厂类
package ConcreteFactory;
import ConcreteProduct.FileLog;
import Factory.LogFactory;
import Product.Log;
public class FileLogFactory implements LogFactory {
public Log createLog() {
return new FileLog();
}
}
具体工厂:数据库日志工厂类
package ConcreteFactory;
import ConcreteProduct.DatabaseLog;
import Factory.LogFactory;
import Product.Log;
public class DatabaseLogFactory implements LogFactory {
public Log createLog() {
return new DatabaseLog();
}
}
客户端测试类
package Test;
import ConcreteFactory.FileLogFactory;
import ConcreteProduct.FileLog;
import Factory.LogFactory;
import Product.Log;
public class test {
public static void main(String args[]){
LogFactory factory;
Log log;
factory=new FileLogFactory();
log=new FileLog();
log.writeLog();
}
}
运行结果:
优点:系统添加新的产品时只需要编写新的具体工厂和具体产品