Javaの设计模式之工厂模式

推荐阅读:《设计模式之禅》

Demo github地址:【FactoryPattern】

FactoryPattern

设计模式之工厂模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到他的子类。

A、工厂模式的优点

  • 良好的封装性
  • 扩展性好
  • 可以屏蔽产品类
  • 工厂模式是典型的解耦框架

B、使用场景

  • new对象的替代品
  • 构建灵活的、可扩展的框架
  • 可应用于异构项目
  • 可使用在测试驱动开发的框架下

C、模式组成:

  • 1、抽象产品类:AbstractTeaProduct
  • 2、具体产品类:QimenBlackTeaDianBlackTeaRouguiWulongTea
  • 3、抽象工厂类:AbstractTeaFactory
  • 4、具体工厂类:ConcreteTeaFactory

本Demo以茶为产品,制茶厂为产品生产者。

一、抽象产品类

public abstract class AbstractTeaProduct   {

    /**
     * 茶汤颜色
     */
    public abstract void teaColor();

    /**
     * 干茶外形
     */
    public abstract void dryTeaShape();

    /**
     * 茶香
     */
    public abstract void teaFlavor();
}

二、具体产品类

  • QimenBlackTea
public class QimenBlackTea extends AbstractTeaProduct {

    @Override
    public void teaColor() {
        System.out.println("祁门红茶 - 汤色红艳明亮");
    }

    @Override
    public void teaFlavor() {
        System.out.println("祁门红茶 - 【花香】蕴含着玫瑰花香,香气馥郁持久;滋味甘甜醇厚");
    }

    @Override
    public void dryTeaShape() {
        System.out.println("祁门红茶 - 条索紧细匀整,锋苗秀丽,色泽乌润");
    }
}

  • DianBlackTea
public class DianBlackTea extends AbstractTeaProduct {


    @Override
    public void teaColor() {
        System.out.println("滇红 - 汤色红浓透明,金圈显露");
    }

    @Override
    public void teaFlavor() {
        System.out.println("滇红 - 【花果香】香气高纯持久;滋味浓厚鲜爽");
    }

    @Override
    public void dryTeaShape() {
        System.out.println("滇红 - 条索紧直肥壮,苗锋秀丽完整,金毫多而显露,色泽油润");
    }
}

三、抽象工厂类

泛型,实现了AbstractTeaProduct抽象类的类都可以作为参数传入。

public abstract class AbstractTeaFactory   {
    public abstract <T extends AbstractTeaProduct>T makeTea(Class<T> tea);
}

四、具体工厂类

public class ConcreteTeaFactory extends AbstractTeaFactory {

    @Override
    public <T extends AbstractTeaProduct> T makeTea(Class<T> concreteTea) {
        AbstractTeaProduct tea = null;
        try{
            tea = (AbstractTeaProduct) Class.forName(concreteTea.getName()).newInstance();
        }catch (Exception e){
            // 异常处理
        }
        return (T)tea;
    }
}

五、场景类

public class LisaTheCat {
public static void main(String[] args){

        AbstractTeaFactory creator = new ConcreteTeaFactory();
        // 祁门红茶
        AbstractTeaProduct qimenBlackTea = creator.makeTea(QimenBlackTea.class);
        qimenBlackTea.dryTeaShape();
        qimenBlackTea.teaColor();
        qimenBlackTea.teaFlavor();
        System.out.println("---------------");
        // 滇红
        AbstractTeaProduct dianBlackTea = creator.makeTea(DianBlackTea.class);
        dianBlackTea.dryTeaShape();
        dianBlackTea.teaColor();
        dianBlackTea.teaFlavor();
        System.out.println("---------------");
        // 肉桂
        AbstractTeaProduct rouguiWulongTea = creator.makeTea(RouguiWulongTea.class);
        rouguiWulongTea.dryTeaShape();
        rouguiWulongTea.teaColor();
        rouguiWulongTea.teaFlavor();
    }
 }

D、简单工厂模式

简化去除AbstractHumanFactory,将makeTea方法定义为静态方法。

public class SimpleTeaFactory{
    public static <T extends AbstractTeaProduct> T makeTea(Class<T> concreteTea) {
        AbstractTeaProduct tea = null;
        try{
            tea = (AbstractTeaProduct) Class.forName(concreteTea.getName()).newInstance();
        }catch (Exception e){
            // 异常处理
        }
        return (T)tea;
    }
}

E、用工厂模式替代单例模式
单例模式的核心:

在内存中只有一个对象

  • 需要单例的类:
public  class Singleton   {
    private Singleton(){}
    public void method(){}
}

  • 创建单例的工厂类:
    【利用反射的方式,为原本无法创建对象的单例类创建一个单例对象】:
public class SingletonFactory  {
    private static Singleton singleton;
    static {
        try {
            Class myClass = Class.forName(Singleton.class.getName());
            Constructor constructor = myClass.getDeclaredConstructor();
            constructor.setAccessible(true);
            singleton = (Singleton) constructor.newInstance();
        }catch (Exception e){
            System.out.println("some exception");
        }
    }
    public static  Singleton getSingleton(){
        return singleton;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 9,194评论 0 14
  • 参考资料:菜鸟教程之设计模式 设计模式概述 设计模式(Design pattern)代表了最佳的实践,通常被有经验...
    Steven1997阅读 4,951评论 1 12
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 9,413评论 1 15
  • 阴雨天没什么好说的,秋天的雨总和阴冷潮湿分不开。但是这里的晴天让我印象特别深刻,天空蓝的让人心醉,整个世界的像素好...
    思维导图实战派_汪志鹏阅读 13,058评论 10 55
  • 艾灸知识大普及,只发一次!(艾灸33问) 无疾养生13833992113微信同号 1、艾灸不能包治百病! 答:希望...
    无疾养生阅读 4,268评论 0 0

友情链接更多精彩内容