设计模式之工厂模式FactoryPattern(二)

发布于:2024-04-30 ⋅ 阅读:(165) ⋅ 点赞:(0)

一、简单工厂

package com.xu.demo.factoryPattern;

/**
 * 简单工厂模式类
 */
public class SimpleFactoryPattern {

    public static Phone create(String name) {
        //根据输入对象名称判断返回相匹配的对象
        if("IPhone".equals(name)) {
            //返回对象
            return new IPhone();
        }else if("MiPhone".equals(name)) {
            return new MiPhone();
        }
        return null;
    }


    public static void main(String[] args) {
        Phone phone = SimpleFactoryPattern.create("IPhone");
        phone.call();

        Phone phone2 = SimpleFactoryPattern.create("MiPhone");
        phone2.call();
    }
}


二、普通工厂

1、Phone接口

package com.xu.demo.factoryPattern;

/**
 * 抽象电话的接口
 */
public interface Phone {
    /**
     * 抽象的打电话的功能,有不同的实现类做具体的实现
     */
    void call();
}

2、PhoneFactory接口

package com.xu.demo.factoryPattern;

public interface PhoneFactory {

    /**
     * 抽象的创建方法
     * @return
     */
    Phone create();
}

 3、IPhone类

package com.xu.demo.factoryPattern;

public class IPhone implements Phone{

    @Override
    public void call() {
        System.out.println("我在使用IPhone给你打电话!");
    }
}

 4、MiPhone类

package com.xu.demo.factoryPattern;

public class MiPhone implements Phone{

    @Override
    public void call() {
        System.out.println("我在使用小米手机给你打电话!");
    }
}

5、IPhoneFactory类

package com.xu.demo.factoryPattern;

/**
 * 苹果手机工厂
 */
public class IPhoneFactory implements PhoneFactory {

    @Override
    public Phone create() {
        return new IPhone();
    }
}

6、MiPhoneFactory类

package com.xu.demo.factoryPattern;

/**
 * 小米手机工厂
 */
public class MiPhoneFactory implements PhoneFactory {

    @Override
    public Phone create() {
        return new MiPhone();
    }
}

7、FactoryPattern类

三、超级工厂 

package com.xu.demo.factoryPattern;

import java.lang.reflect.InvocationTargetException;

/***
 *
 * 超级工厂(简单工厂 + 反射 + 泛型),利用反射机制解决开闭原则的问题
 */
public class SuperFactory {

    public static void main(String[] args) {
        //com.lx.dom.impl.pro这一段是包名,IPhone是类名,不能输错
        Phone phone = SuperFactory.create("com.xu.demo.factoryPattern.MiPhone") ;
        phone.call();
    }


    /**
     * 根据完整类型名动态加载class并创建实例
     * @param className
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T create(String className) {

        try {
            //动态加载class
            Class<?> clazz = Class.forName(className);

            //通过calss对象获取构造函数创建新实例
            return (T) clazz.getConstructor().newInstance();
        } catch (Exception e) {

            //异地重抛
            throw new RuntimeException("Create instance fail.",e);
        }
    }

}


网站公告

今日签到

点亮在社区的每一天
去签到