1.定义:将对象的创建委托给另一个类,客户端只负责消费对象,不负责对象的创建。即定义一个用来创建某类对象的类
2.UML:
3.理论基础:里氏替换原则,继承,多态
4.设计角色:
抽象产品:某类产品的抽象,主要定义了产品具有的属性和行为
产品工厂:该模式的核心,主要负责产品的创建,创建方法返回值为抽象产品
具体产品:抽象产品的子类
5.优点
客户端只负责消费对象,不关心对象的创建细节
6.缺点
1. 违背开闭原则以及高内聚低耦合原则。后续其他具体产品加入时需要新增创建分支,随着分支的增加后续工厂方法的逻辑和越来越复杂。
2.违背单一职责,工厂方法中含有承担的职责过多,负责创建合适的对象。当工厂类出现问题时候,就无法获得对象
3.工厂方法一般都是静态的,无法被子类重载/重写,不具有扩展性
7.使用场景
1.系统中抽象产品的种类以及具体产品的种类不多且固定
2.不关心对象的创建,只负责消费对象
8.Code
//抽象产品
package com.patterns.build.simple.factory.common;
public interface IProducet {
public String getProducetName();
}
//具体产品
package com.patterns.build.simple.factory.version1;
import com.patterns.build.simple.factory.common.IProducet;
public class BoxProduce implements IProducet {
@Override
public String getProducetName() {
return this.getClass().getName();
}
}
package com.patterns.build.simple.factory.version1;
import com.patterns.build.simple.factory.common.IProducet;
public class DeskProducet implements IProducet {
@Override
public String getProducetName() {
return this.getClass().getName();
}
}
//简单工厂
package com.patterns.build.simple.factory.version1;
import com.patterns.build.simple.factory.common.IProducet;
public class SimpleFactory {
public static IProducet getInstance(String type) {
if("DESK".equalsIgnoreCase(type)) {
return new DeskProducet();
} else if("BOX".equalsIgnoreCase(type)) {
return new BoxProduce();
} else {
return null;
}
}
}
//客户端
package com.patterns.build.simple.factory.version1;
import com.patterns.build.simple.factory.common.IProducet;
public class Client {
public static void main(String[] args) {
IProducet produce = SimpleFactory.getInstance("desk");
System.out.println(produce.getProducetName());
produce = SimpleFactory.getInstance("box");
System.out.println(produce.getProducetName());
}
}
针对于简单工厂的缺点可以采用反射+范型进行优化。但是需要具体产品提供一个无参的构造方法
//具体产品
package com.patterns.build.simple.factory.version2;
import com.patterns.build.simple.factory.common.IProducet;
public class BikeProduce implements IProducet {
@Override
public String getProducetName() {
return this.getClass().getName();
}
}
package com.patterns.build.simple.factory.version2;
import com.patterns.build.simple.factory.common.IProducet;
public class CarProduce implements IProducet{
@Override
public String getProducetName() {
return this.getClass().getName();
}
}
//简单工厂
package com.patterns.build.simple.factory.version2;
import com.patterns.build.simple.factory.common.IProducet;
public class SimpleFactory<T> {
public <T> T getProduec(String packageName) {
try {
Class<T> clazz = (Class<T>) Class.forName(packageName);
return clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
return null;
}
}
//客户端
package com.patterns.build.simple.factory.version2;
import com.patterns.build.simple.factory.common.IProducet;
import sun.security.x509.IPAddressName;
public class Client {
public static void main(String[] args) {
SimpleFactory<? extends IProducet> sf = new SimpleFactory<IProducet>();
IProducet producet = sf.getProduec("com.patterns.build.simple.factory.version2.BikeProduce");
System.out.println(producet.getProducetName());
sf = new SimpleFactory<CarProduce>();
IProducet car = sf.getProduec("com.patterns.build.simple.factory.version2.CarProduce");
System.out.println(car.getProducetName());
}
}