美文网首页UIT
创建类——工厂模式

创建类——工厂模式

作者: Jason_Sam | 来源:发表于2019-05-28 22:09 被阅读1次
Factory.png

工厂模式

  1. 工厂模式
  2. 抽象工厂模式

工厂方法模式

  • 定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实例化延迟到其子类。

  • UML类图: 标准工厂模式
  • 综合分析:

    优点:

    1. 封装性好(隐藏具体代码的实现),代码结构清晰。
    2. 扩展性优秀。
    3. 屏蔽产品类,产品类的实现与调用方无关,调用方只关心工厂接口。

    缺点:

    1. 代码臃肿,增加代码复杂度。

    适用场景:

    1. 需要灵活,可扩展的框架。
    2. 产品类过多,需要统一管理。
    3. 测试系统中。
  • 拓展:

    简单工厂

    简单工厂模式

工厂方法模式实践

产品类
    publi abstract class Produce {
        public abstract void dosomething();
    }
    
    public class ConcreteProduceA extends Produce {
        @Override
        public void dosomething() {
            System.out.println("I am ProduceA!");
        }
    }
    
    public class ConcreteProduceB extends Produce {
        @Override
        public void dosomething() {
            System.out.println("I am ProduceB!");
        }
    }
工厂类
    public abstract class Creator {
        public abstract <T extends Produce>T createProduce(Class<T> c);
    }
    
    public class ConcreteCreator extends Creator {
        @Override
        public <T extends Produce>T createProduce(Class<T> c) {
            Produce produce = null;
            try {
                produce = (Produce)Class.forName(c.getName()).newInstance();
            } catch (Exception e) {
                // TODO: handle exception
            }
            return (T)produce;
        }
    }
客户端
public class client {
    public static void main(String[] args) {
        Creator creator = new ConcreteCreator();
        Produce A = creator.createProduce(ConcreteProduceA.class);
        A.dosomething();
        Produce B = creator.createProduce(ConcreteProduceB.class);
        B.dosomething();
    }
}

抽象工厂模式

  • 定义:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。

  • UML类图: 抽象工厂模式
  • 综合分析:

    缺点:

    1. 产品族拓展困难,修改产品族(例如添加一个产品3)必须要对AbstractCreator和其子类修改,严重违反了“开闭原则”。

    适用场景:

    1. 一个对象族有相同的约束。即类图中的,produce1和2都有A和B的约束。
    2. 横向拓展容易,纵向拓展困难。(图中produce1、2拓展困难,A和B拓展简单)

抽象工厂模式实践

产品类
    public abstract class Produce1 {
        public abstract void dosomething();
    }
    
    public class ConcreteProduceA1 extends Produce1 {
        @Override
        public void dosomething() {
            System.out.println("I am ProduceA1!");
        }
    }
    
    public class ConcreteProduceB1 extends Produce1 {
        @Override
        public void dosomething() {
            System.out.println("I am ProduceB1!");
        }
    }
    
    public abstract class Produce2 {
        public abstract void dosomething();
    }
    
    public class ConcreteProduceA2 extends Produce2 {
        @Override
        public void dosomething() {
            System.out.println("I am ProduceA2!");
        }
    }
    
    public class ConcreteProduceB2 extends Produce2 {
        @Override
        public void dosomething() {
            System.out.println("I am ProduceB2!");
        }
    }
工厂类
    public abstract class Creator {
        public abstract Produce1 createProduce1();
        public abstract Produce2 createProduce2();
    }
    
    public class ConcreteCreatorA extends Creator {
        @Override
        public Produce1 createProduce1(){
            return new ConcreteProduceA1();
        }
        
        @Override
        public Produce2 createProduce2() {
            return new ConcreteProduceA2();
        }
    }
    
    public class ConcreteCreatorB extends Creator {
        @Override
        public Produce1 createProduce1(){
            return new ConcreteProduceB1();
        }
        
        @Override
        public Produce2 createProduce2() {
            return new ConcreteProduceB2();
        }
    }
客户端
public class client {
    public static void main(String[] args) {
        Creator creatorA = new ConcreteCreatorA();
        Creator creatorB = new ConcreteCreatorB();
        Produce1 A1 = creatorA.createProduce1();
        A1.dosomething();
        Produce2 A2 = creatorA.createProduce2();
        A2.dosomething();
        Produce1 B1 = creatorB.createProduce1();
        B1.dosomething();
        Produce2 B2 = creatorB.createProduce2();
        B2.dosomething();
    }
}

源代码

相关文章

  • JS设计模式之抽象工厂模式

    定义:抽象工厂模式就是:围绕一个超级工厂类,创建其他工厂类;再围绕工厂类,创建实体类。相较于传统的工厂模式,它多出...

  • 常用设计模式 精简总结

    创建型模式 工厂模式:创建工厂接口类(规范),子类(工厂)实现业务。 抽象工厂模式:工厂的创建由子类决定,其子类的...

  • 工厂模式

    建造型设计模式 简单工厂模式 简要定义 简单工厂模式属于类创建模式. 简单工厂模式通过专门定义一个类来负责创建其他...

  • 几种设计模式

    创建类模式 构造模式 工厂模式

  • 3. 设计模式的代码表示之一

    一、工厂模式(【客户类】→【工厂类/工厂方法】→创建【服务类】) 二、抽象工厂(【客户类】→【抽象工厂类】→【工厂...

  • 抽象工厂模式-创建型模式

    抽象工厂模式就是在工厂模式的基础上多加几个产品。工厂模式的工厂类可以创建一个产品,而抽象工厂模式类可以创建一系列产...

  • Java23种设计模式-简单工厂模式

    简单工厂模式详解 1,概述 简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。在简单工厂模式中...

  • 设计模式学习记录

    简单工厂模式:创建型模式基本实现:所有产品类继承自产品接口/父类,工厂类根据输入创建产品实例全部的创建逻辑都在工厂...

  • 设计模式之工厂模式(一)

    介绍工厂模式 工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类。 工厂模式定义一个用于创建对象的接口...

  • 设计模式 —— 工厂方法模式

    概念 工厂方法模式又称工厂模式,也叫多态工厂模式,属于类创建型模式工厂方法模式实质就是: 把创建对象的过程抽象出来...

网友评论

    本文标题:创建类——工厂模式

    本文链接:https://www.haomeiwen.com/subject/eeldtctx.html