创建对象的过程与使用对象的过程分离。
工厂模式是一种创建型设计模式,其主要思想是定义一个用于创建对象的接口,但让实现该接口的类决定实例化哪个类。这样,工厂模式使得一个类的实例化延迟到其子类,从而在编程时可以基于接口编程,而不是具体的类
通过工厂去创建对象,使用者不需要知道创建的过程就可以拿到初始化的对象。
-
简单工厂模式):
- 使用一个单独的工厂类来创建不同的对象,根据传入的参数决定创建哪种类型的对象。
-
工厂方法模式:
- 工厂方法模式定义了一个创建对象的接口,但由子类决定实例化哪个类。工厂方法将对象的创建延迟到子类。
-
抽象工厂模式:
- 抽象工厂模式提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
- 抽象工厂模式 | 菜鸟教程 (runoob.com)
下面仅为个人开发习惯,并不完全符合工厂思想。
package com.msq.pattern.factory;
public interface MethodInterface {
void doWhat();
}
package com.msq.pattern.factory;
import java.lang.reflect.Field;
import java.util.Date;
/**
* 简单工厂模式: 提取代码封装
* 降低耦合度
* 创建对象的过程和实际的业务代码解耦
* 简化代码逻辑
* 封装对象创建逻辑,使用者只知道通过接口去调用方法获取对象,不关系具体创建过程
*
*
*/
public class SimpleFactory {
public static <T extends Animal> T getShape(Class<? extends T> clazz) throws NoSuchFieldException, IllegalAccessException, InstantiationException {
T t = clazz.newInstance();
t.setCreateTime(new Date());
t.setUpdateTime(new Date());
t.setUserFlag(0);
Field field = clazz.getDeclaredField("ClassName");
field.setAccessible(true);
String value = (String) field.get(null);
if(value.equals("人")){
return (T) t.setPName("一个人");
} else if(value.equals("狗")){
return (T) t.setPName("一条狗");
}
return t;
}
/**
* 吃口饭
* ChildEntity{userFlag=0, createTime=Mon Jul 01 20:55:20 CST 2024, updateTime=Mon Jul 01 20:55:20 CST 2024, name='一个人'}
* Mon Jul 01 20:55:20 CST 2024
* 吃骨头
* ChildEntity2{userFlag=0, createTime=Mon Jul 01 20:55:20 CST 2024, updateTime=Mon Jul 01 20:55:20 CST 2024, name='一条狗'
* @param args
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, InstantiationException {
Animal shape = SimpleFactory.getShape(ChildEntity.class);
shape.doWhat();
System.out.println(shape.getUpdateTime());
SimpleFactory.getShape(ChildEntity2.class).doWhat();
}
abstract static class Animal implements MethodInterface{
abstract Animal setPName(String name);
// 名字
public static String ClassName = "animal";
public Integer userFlag;
public Date createTime;
public Date updateTime;
public Integer getUserFlag() {
return userFlag;
}
public void setUserFlag(Integer userFlag) {
this.userFlag = userFlag;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
@Override
public void doWhat() {
System.out.println();
}
}
static class ChildEntity extends Animal implements MethodInterface{
public static String ClassName = "人";
private String name;
public String getName() {
return name;
}
public ChildEntity setName(String name) {
this.name = name;
return this;
}
@Override
public String toString() {
return "ChildEntity{" +
"userFlag=" + super.userFlag +
", createTime=" + super.createTime +
", updateTime=" + super.updateTime +
", name='" + name + '\'' +
'}';
}
@Override
Animal setPName(String name) {
setName(name);
return this;
}
@Override
public void doWhat() {
System.out.println("吃口饭");
System.out.println(this.toString());
}
}
static class ChildEntity2 extends Animal implements MethodInterface{
public static String ClassName = "狗";
private String name;
public String getName() {
return name;
}
public ChildEntity2 setName(String name) {
this.name = name;
return this;
}
@Override
public String toString() {
return "ChildEntity2{" +
"userFlag=" + super.userFlag +
", createTime=" + super.createTime +
", updateTime=" + super.updateTime +
", name='" + name + '\'' +
'}';
}
@Override
public void doWhat() {
System.out.println("吃骨头");
System.out.println(this.toString());
}
@Override
Animal setPName(String name) {
setName(name);
return this;
}
}
}