工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。
在《设计模式》一书中工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。简单工厂模式(Simple Factory)
简单工厂,工厂模式定义:提供创建对象的接口。简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
1.Factory:工厂类,简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
2.IProduct:抽象产品类,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3.Product:具体产品类,是简单工厂模式的创建目标。
简单理解:一个工厂(Factory工厂类),有一系列产品(IProduct抽象产品类),该系列产品都有哪种型号(Product具体产品类)
举例:
Factory:工厂类
package com.study.main;
public class ToolFactory {
public ToolInterface getTool(String name){
if(name.equals("Tongs")){
return new Tongs(name);
}
if(name.equals("Hammer")){
return new Hammer(name);
}
return null;
}
}
IProduct:抽象产品类
package com.study.main;
public interface ToolInterface {
public String name ();
public void methods();
}
Product:具体产品类
package com.study.main;
public class Hammer implements ToolInterface{
public String name;
public Hammer(String name) {
this.name = name;
}
@Override
public String name() {
return this.name;
}
@Override
public void methods() {
System.out.println(this.name);
}
}
public class Tongs implements ToolInterface{
public String name;
public Tongs(String name) {
this.name = name;
}
@Override
public String name() {
return this.name;
}
@Override
public void methods() {
System.out.println(this.name);
}
}
调用:
package com.study.main;
public class FactoryMain {
public static void main(String[] args) {
ToolFactory toolFactory = new ToolFactory();
ToolInterface tongs = toolFactory.getTool("Hammer");
tongs.methods();
}
}
优点:
缺点:
违反了开闭原则,所以不常用
工厂方法模式属于类的创建型模式又被称为多态工厂模式。工厂方法模式的意义在于定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,仅负责声明具体工厂子类必须实现的接口。这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
UML图
举例
抽象工厂 接口
package com.study.main.FactoryMethod;
public interface Factory {
void method();
}
抽象产品 接口
package com.study.main.FactoryMethod;
public interface Tool {
String name();
}
具体工厂1
package com.study.main.FactoryMethod;
public class TongsFactory implements Factory{
@Override
public void method() {
String tongs = new Tongs("Tongs").name();
System.out.println(tongs);
}
}
具体工厂 2
package com.study.main.FactoryMethod;
public class HammerFactory implements Factory{
@Override
public void method() {
String hammer = new Hammer("Hammer").name();
System.out.println(hammer);
}
}
具体产品1
package com.study.main.FactoryMethod;
public class Tongs implements Tool{
String name;
public Tongs(String name) {
this.name = name;
}
@Override
public String name() {
return this.name;
}
}
具体产品2
package com.study.main.FactoryMethod;
public class Hammer implements Tool{
String name;
public Hammer(String name) {
this.name = name;
}
@Override
public String name() {
return this.name;
}
}
调用
package com.study.main.FactoryMethod;
import com.study.main.ToolFactory;
public class FactoryMethodMain {
public static void main(String[] args) {
new HammerFactory().method();
new TongsFactory().method();
}
}
优点:
缺点:
是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
例子:
抽象接口
package com.study.main.AbstractFactory;
public interface AbstractFactory {
Pencil createPencil();
Eraser createEraser();
}
package com.study.main.AbstractFactory;
public interface Eraser {
void erase();
}
package com.study.main.AbstractFactory;
public interface Pencil {
void draw();
}
抽象类
package com.study.main.AbstractFactory;
public class ChenGuangEraser implements Eraser{
@Override
public void erase() {
System.out.println("----------ChenGuang Erase---------------");
}
}
package com.study.main.AbstractFactory;
public class ChenguangFactory implements AbstractFactory{
@Override
public Pencil createPencil() {
return new ChenGuangPencil();
}
@Override
public Eraser createEraser() {
return new ChenGuangEraser();
}
}
package com.study.main.AbstractFactory;
public class ChenGuangPencil implements Pencil{
@Override
public void draw() {
System.out.println("----------ChenGuang Draw---------------");
}
}
package com.study.main.AbstractFactory;
public class TrueColorEraser implements Eraser{
@Override
public void erase() {
System.out.println("----------TrueColor Erase---------------");
}
}
package com.study.main.AbstractFactory;
public class TrueColorFactory implements AbstractFactory{
@Override
public Pencil createPencil() {
return new TrueColorPencil();
}
@Override
public Eraser createEraser() {
return new TrueColorEraser();
}
}
package com.study.main.AbstractFactory;
public class TrueColorPencil implements Pencil{
@Override
public void draw() {
System.out.println("----------TrueColor Draw---------------");
}
}
优点:
缺点:
Spring中的应用: