zoukankan      html  css  js  c++  java
  • 工厂模式

    *概述:

    • 在创建一个对象时,不向客户端暴露内部细节,并提供一个创建对象的通用接口

    1. 简单工厂

    • 把实例化的操作单独放到一个类中,整个类就成为简单工厂类,让简单工厂决定应该使用哪个具体子类来实例化
    • 优点:客户并不需要直到子类的细节以及应当实例化哪个,而当子类发生修改时,也并不需要客户进行修改
    public class SimpleFactory {
    
        public Product createProduct(int type) {
            if (type == 1) {
                return new ConcreteProduct1();
            } else if (type == 2) {
                return new ConcreteProduct2();
            }
            return new ConcreteProduct();
        }
    }
    public class Client {
    
        public static void main(String[] args) {
            SimpleFactory simpleFactory = new SimpleFactory();
            Product product = simpleFactory.createProduct(1);
            // do something with the product
        }
    }

    2. 工厂方法

    • 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法将类的实例化延迟到其之类
    • 与简单工厂模式的区别:
      • 简单工厂模式在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了具体产品的依赖。
      • 但是需要增加新功能时,需要修改原有的类,违背了开放-封闭原则。
    public abstract class Factory {
        abstract public Product factoryMethod();
        public void doSomething() {
            Product product = factoryMethod();
            // do something with the product
        }
    }
    public class ConcreteFactory1 extends Factory {
        public Product factoryMethod() {
            return new ConcreteProduct1();
        }
    }
    public class ConcreteFactory2 extends Factory {
        public Product factoryMethod() {
            return new ConcreteProduct2();
        }
    }
    public class ConcreteFactory3 extends Factory {
        public Product factoryMethod() {
            return new ConcreteProduct3();
        }
    }

    3. 抽象工厂

    • 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
    • 继承父类工厂的不同子类,分别新建不同的实例,当实例不同的子类时,就可以new不同的类了
    public class AbstractProductA {
    }
    public class AbstractProductB {
    }
    public class ProductA1 extends AbstractProductA {
    }
    public class ProductA2 extends AbstractProductA {
    }
    public class ProductB1 extends AbstractProductB {
    }
    public class ProductB2 extends AbstractProductB {
    }
    public abstract class AbstractFactory {
        abstract AbstractProductA createProductA();
        abstract AbstractProductB createProductB();
    }
    public class ConcreteFactory1 extends AbstractFactory {
        AbstractProductA createProductA() {
            return new ProductA1();
        }
    
        AbstractProductB createProductB() {
            return new ProductB1();
        }
    }
    public class ConcreteFactory2 extends AbstractFactory {
        AbstractProductA createProductA() {
            return new ProductA2();
        }
    
        AbstractProductB createProductB() {
            return new ProductB2();
        }
    }
    public class Client {
        public static void main(String[] args) {
            AbstractFactory abstractFactory = new ConcreteFactory1();
            AbstractProductA productA = abstractFactory.createProductA();
            AbstractProductB productB = abstractFactory.createProductB();
            // do something with productA and productB
        }
    }
  • 相关阅读:
    【原】结构体包含CString类型成员变量出错的原理
    Android View移动的六种方法
    Android开发之getX,getRawX,getWidth,getTranslationX等的区别
    Android 自定义漂亮的圆形进度条
    android studio 如何让包名展开
    Android基础之——CountDownTimer类,轻松实现倒计时功能
    Java/Android倒计时(开始,暂停,恢复,停止)
    Android Studio:正确导入SO相关文件
    Android MediaPlayer和VideoView的使用
    android studio 将自己的项目生成jar包
  • 原文地址:https://www.cnblogs.com/BitingCat/p/10541038.html
Copyright © 2011-2022 走看看