程序员设计模式(java)

工厂模式

2019-06-19  本文已影响0人  降龙_伏虎

1.简单工厂模式

简单工厂模式(Smple Factory Pattern) 是指有一个工厂对象决定创建出哪一种产品的实例
适用于工厂类创建实例对象较少的情况.调用时只需传入参数即可
image.png
/**
 * Description:水果接口
 *
 * @date 2019-04-26 11:27
 */

public interface IFruits {

    /**
     * Description:获取水果名称
     * @Date  2019-04-26 11:28
     * @Param []
     * @return java.lang.String
    **/

    String getName();
}

/**
 * Description:苹果类
 *
 * @date 2019-04-26 11:29
 */

public class Apple implements IFruits{
    public String getName() {
        return "苹果";
    }
}

/**
 * Description:水果工厂
 *
 * @date 2019-04-26 11:30
 */

public class FruitsFactory {

    public static IFruits produce(Class type){
        IFruits fruits = null;
        try {
            fruits = (IFruits) Class.forName(type.getName()).newInstance();
        } catch (InstantiationException e) {
            System.out.println("抽象类或接口");
        } catch (IllegalAccessException e) {
            System.out.println("私有对象");
        } catch (ClassNotFoundException e) {
            System.out.println("类不存在");
        }
        return fruits;
    }

    //测试
    public static void main(String[] args) {
        IFruits fruits = FruitsFactory.produce(com.sky.designpattern.simplefactory.Apple.class);
        System.out.println(fruits == null?"":fruits.getName());
    }
}

2.工厂方法模式

工厂方法模式(Factory Method Pattern) 是指定一个创建对象的接口
但实际上对象的创建过程由接口的实现类负责,将类的实例化推迟到实现类中
image.png
/**
 * Description:水果接口
 *
 * @date 2019-04-26 11:27
 */

public interface IFruits {

    /**
     * Description:获取水果名称
     * @Date  2019-04-26 11:28
     * @Param []
     * @return java.lang.String
    **/

    String getName();
}

/**
 * Description:苹果类
 *
 * @date 2019-04-26 11:29
 */

public class Apple implements IFruits{
    public String getName() {
        return "苹果";
    }
}

/**
 * Description:香蕉类
 *
 * @date 2019-04-26 11:29
 */

public class Banana implements IFruits{
    public String getName() {
        return "香蕉";
    }
}

/**
 * Description:水果工厂接口
 *
 * @date 2019-04-26 11:30
 */

public interface IFruitsFactory {

      IFruits produce();
}

/**
 * Description:苹果工厂
 *
 * @date 2019-04-26 11:48
 */
public class AppleFactory implements IFruitsFactory {
    @Override
    public IFruits produce() {
        return new Apple();
    }
}


/**
 * Description:香蕉工厂
 *
 * @date 2019-04-26 11:48
 */

public class BananaFactory implements IFruitsFactory {
    @Override
    public IFruits produce() {
        return new Banana();
    }
}

实际使用中工厂可采用spring注入,返回结果可采用泛型

/**
 * Description:水果工厂接口
 *
 * @date 2019-04-26 11:30
 */

public interface IFruitsFactory<T extends IFruits> {

      T produce();
}
/**
 * Description:苹果工厂
 *
 * @date 2019-04-26 11:48
 */
public class AppleFactory implements IFruitsFactory {
    @Override
    public Apple produce() {
        return new Apple();
    }
}
/**
 * Description:香蕉工厂
 *
 * @date 2019-04-26 11:48
 */

public class BananaFactory implements IFruitsFactory {
    @Override
    public Banana produce() {
        return new Banana();
    }
}

3.抽象工厂模式

image.png
/**
 * Description:水果接口
 *
 * @date 2019-04-26 14:21
 */

public interface IFruits {

    String getName();
    String getBrand();
}

/**
 * Description:红富士苹果类
 *
 * @date 2019-04-26 14:23
 */

public class HongFushiApple implements IFruits{
    @Override
    public String getName() {
        return "苹果";
    }

    @Override
    public String getBrand() {
        return "红富士";
    }
}
/**
 * Description:红富士香蕉类
 *
 * @date 2019-04-26 14:23
 */

public class HongFushiBanana implements IFruits{
    @Override
    public String getName() {
        return "香蕉";
    }

    @Override
    public String getBrand() {
        return "红富士";
    }
}

/**
 * Description:黄元帅苹果类
 *
 * @date 2019-04-26 14:23
 */

public class HuangYuanShuaiApple implements IFruits{
    @Override
    public String getName() {
        return "苹果";
    }

    @Override
    public String getBrand() {
        return "黄元帅";
    }
}

/**
 * Description:黄元帅香蕉类
 *
 * @date 2019-04-26 14:23
 */

public class HuangYuanShuaiBanana implements IFruits{
    @Override
    public String getName() {
        return "香蕉";
    }

    @Override
    public String getBrand() {
        return "黄元帅";
    }
}

/**
 * Description:红富士水果工厂
 *
 * @date 2019-04-26 14:16
 */

public class HongFuShiFactory implements IFruitsFactory {
    @Override
    public IFruits produceApple() {
        return new HongFushiApple();
    }

    @Override
    public IFruits produceBanana() {
        return new HuangYuanShuaiBanana();
    }
}

/**
 * Description:黄元帅水果工厂
 *
 * @date 2019-04-26 14:16
 */

public class HuangYuanShuaiFactory implements IFruitsFactory {
    @Override
    public IFruits produceApple() {
        return new HuangYuanShuaiApple();
    }

    @Override
    public IFruits produceBanana() {
        return new HongFushiBanana();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读