• 设计模式之工厂模式


    概述

    工厂方法模式是创建型设计模式的一种,定义一个用于创建对象的接口,让子类决定实例化那个类,工厂方法使一个类的实例化延迟到其子类
    工厂方法模式也叫工厂模式或虚拟构造器模式,在工厂方法模式中,一个工厂父类包含多个工厂子类,父类定义接口,子类负责创建具体的产品对象.

    UML

    • 抽象工厂(Creator) : 工厂方法模式的核心
    • 具体工厂(ConcreateCreator) : 实现了具体的业务逻辑
    • 抽象产品(Product) : 工厂方法模式所创建的产品的父类
    • 具体产品(ConcreateProduct) : 实现抽象产品的某个具体产品对象

    使用场景

    • 在任何需要生成复杂对象的地方,都可以使用工厂方法模式,复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式

    实例

    工厂方法模式分为三种,普通工厂模式,多个工厂方法模式,静态工厂方法模式,其实在工厂方法模式中还有一种特例,叫做简单工厂模式(或者静态工厂方法模式),
    静态工厂模式是Effective Java第一条推荐的创建对象的方式,静态工厂方法常见于我们的工具类,如TextUtil等,

    普通工厂模式实例代码

    //抽象产品
    public interface Product {
    }
    
    //具体产品类
    //具体产品类
    public class ConcreteProductA implements Product {
    
        public ConcreteProductA() {
            System.out.println("method: -->我是具体的产品A");
        }
    
    }
    
    public class ConcreteProductB implements Product {
    
        public ConcreteProductB() {
            System.out.println("method: -->我是具体的产品B");
        }
    
    }
    
    // 抽象工厂类
    public abstract class Factory {
        public abstract Product createProduct();
    }
    
    // 具体工厂类
    public class ConcreteFactory extends Factory {
        @Override public Product createProduct() {
            return new ConcreteProductA();
        }
    }
    
    //客户端调用代码
    public class Test {
        public static void main(String[] args) {
            Factory factory = new ConcreteFactory();
            Product product = factory.createProduct();
    
        }
    }
    

    多个工厂方法模式

    多个方法工厂模式是普通工厂方法模式的升级版,就是工厂中提供多个方法

    public class MoreMethodConcreteFactory extends MoreMethodFactory {
    
        @Override
        public  Product createProducA() {
            return new ConcreteProductA();
        }
    
        @Override
        public Product createProductB() {
            return new ConcreteProductB();
        }
    }
    

    静态工厂方法模式

    在多个工厂方法模式的基础上进一步改造

    public class StaticFactory{
        public static  Product createProducA(){
            return new ConcreteProductA();
        }
    
        public static Product createProductB(){
            return new ConcreteProductB();
        }
    }
    

    这样的话,客户端的调用就不需要创建工厂对象了

    Product productA = StaticFactory.createProductA();
    
    Product productB = StaticFactory.createProductB();
    
    

    优缺点

    优点

    • 良好的封装性和清晰的代码结构,不需要知道对象的创建过程,降低模块间的耦合.
    • 优秀的拓展性,如果需要增加产品,只需要拓展一个工厂类即可,很好的拥抱了变化.
    • 屏蔽产品类,产品类的任何变化,客户端都不需要关心,只需要关注产品接口即可.
    • 解耦,高层模块只需要知道产品的抽象类,不需要关心其实现

    缺点

    • 结构复杂化,每次添加新产品时,都需要编写一个新的产品类.同时还要引入其抽象层,导致结构变得复杂,因此在特定场景是否使用工厂方法模式还需设计者权衡利弊了
    • 一个工厂只能创建一种产品.

    see source code

  • 相关阅读:
    视图
    Adaboost算法
    关于友谊的残酷真相
    排序与搜索
    队列

    Xgboost集成算法
    川普“零容忍”政策:拆散移民家庭惹争议
    第八篇:使用字符串流对象进行格式转换
    第七篇:两个经典的文件IO程序示例
  • 原文地址:https://www.cnblogs.com/Dyleaf/p/8507023.html
Copyright © 2020-2023  润新知