设计模式2-工厂模式

创建对象的过程与使用对象的过程分离。

       工厂模式是一种创建型设计模式,其主要思想是定义一个用于创建对象的接口,但让实现该接口的类决定实例化哪个类。这样,工厂模式使得一个类的实例化延迟到其子类,从而在编程时可以基于接口编程,而不是具体的类

        通过工厂去创建对象,使用者不需要知道创建的过程就可以拿到初始化的对象。

  1. 简单工厂模式)

    • 使用一个单独的工厂类来创建不同的对象,根据传入的参数决定创建哪种类型的对象。
  2. 工厂方法模式

    • 工厂方法模式定义了一个创建对象的接口,但由子类决定实例化哪个类。工厂方法将对象的创建延迟到子类。
  3. 抽象工厂模式

下面仅为个人开发习惯,并不完全符合工厂思想。

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;
    }


  }

}

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值